Scale Reliabilities
Org Dehumanization
dat %>%
select(orgdehum_1:orgdehum_11) %>%
as.data.frame(.) %>%
psych::alpha(.)
Reliability analysis
Call: psych::alpha(x = .)
lower alpha upper 95% confidence boundaries
0.93 0.94 0.95
Reliability if an item is dropped:
Item statistics
Non missing response frequency for each item
1 2 3 4 5 6 7 miss
orgdehum_1 0.07 0.14 0.17 0.13 0.25 0.16 0.06 0
orgdehum_2 0.09 0.18 0.16 0.16 0.13 0.09 0.17 0
orgdehum_3 0.13 0.15 0.14 0.15 0.18 0.09 0.15 0
orgdehum_4 0.10 0.16 0.16 0.13 0.21 0.11 0.13 0
orgdehum_5 0.07 0.10 0.14 0.15 0.28 0.15 0.10 0
orgdehum_6 0.09 0.17 0.20 0.14 0.17 0.11 0.12 0
orgdehum_7 0.13 0.16 0.17 0.13 0.17 0.10 0.13 0
orgdehum_8 0.10 0.12 0.16 0.14 0.23 0.12 0.13 0
orgdehum_9 0.28 0.28 0.15 0.07 0.08 0.05 0.08 0
orgdehum_10 0.24 0.26 0.15 0.09 0.09 0.05 0.11 0
orgdehum_11 0.27 0.26 0.14 0.08 0.11 0.06 0.08 0
***Alpha improves to .96 if Item 1 is dropped
HR Attributions
dat %>%
select(exploit_1:wbatt_3) %>%
psych::alpha(.)
Some items were negatively correlated with the total scale and probably
should be reversed.
To do this, run the function again with the 'check.keys=TRUE' option
Some items ( exploit_1 exploit_2 exploit_3 cost_1 cost_2 cost_3 ) were negatively correlated with the total scale and
probably should be reversed.
To do this, run the function again with the 'check.keys=TRUE' option
Reliability analysis
Call: psych::alpha(x = .)
lower alpha upper 95% confidence boundaries
0.63 0.68 0.74
Reliability if an item is dropped:
Item statistics
Non missing response frequency for each item
1 2 3 4 5 6 7 miss
exploit_1 0.14 0.24 0.14 0.13 0.14 0.09 0.12 0
exploit_2 0.16 0.32 0.19 0.12 0.11 0.07 0.02 0
exploit_3 0.13 0.28 0.14 0.12 0.17 0.09 0.06 0
cost_1 0.08 0.11 0.07 0.14 0.23 0.18 0.19 0
cost_2 0.05 0.07 0.06 0.10 0.31 0.21 0.18 0
cost_3 0.05 0.13 0.09 0.16 0.23 0.18 0.16 0
perfatt_1 0.05 0.08 0.08 0.16 0.20 0.32 0.11 0
perfatt_2 0.07 0.08 0.09 0.16 0.19 0.29 0.12 0
perfatt_3 0.04 0.02 0.05 0.08 0.24 0.36 0.20 0
wbatt_1 0.09 0.10 0.12 0.14 0.21 0.23 0.10 0
wbatt_2 0.09 0.10 0.09 0.14 0.22 0.23 0.12 0
wbatt_3 0.08 0.11 0.09 0.14 0.24 0.22 0.12 0
Horrible alpha, as expected. Scale consists of two conceptually distinct factors.
Exploitation Attributions
dat %>%
select(exploit_1:exploit_3) %>%
psych::alpha(.)
Reliability analysis
Call: psych::alpha(x = .)
lower alpha upper 95% confidence boundaries
0.86 0.88 0.9
Reliability if an item is dropped:
Item statistics
Non missing response frequency for each item
1 2 3 4 5 6 7 miss
exploit_1 0.14 0.24 0.14 0.13 0.14 0.09 0.12 0
exploit_2 0.16 0.32 0.19 0.12 0.11 0.07 0.02 0
exploit_3 0.13 0.28 0.14 0.12 0.17 0.09 0.06 0
Cost-saving Attributions
dat %>%
select(cost_1:cost_3) %>%
psych::alpha(.)
Reliability analysis
Call: psych::alpha(x = .)
lower alpha upper 95% confidence boundaries
0.89 0.9 0.92
Reliability if an item is dropped:
Item statistics
Non missing response frequency for each item
1 2 3 4 5 6 7 miss
cost_1 0.08 0.11 0.07 0.14 0.23 0.18 0.19 0
cost_2 0.05 0.07 0.06 0.10 0.31 0.21 0.18 0
cost_3 0.05 0.13 0.09 0.16 0.23 0.18 0.16 0
Well-being Attributions
dat %>%
select(wbatt_1:wbatt_3) %>%
psych::alpha(.)
Reliability analysis
Call: psych::alpha(x = .)
lower alpha upper 95% confidence boundaries
0.93 0.94 0.95
Reliability if an item is dropped:
Item statistics
Non missing response frequency for each item
1 2 3 4 5 6 7 miss
wbatt_1 0.09 0.10 0.12 0.14 0.21 0.23 0.10 0
wbatt_2 0.09 0.10 0.09 0.14 0.22 0.23 0.12 0
wbatt_3 0.08 0.11 0.09 0.14 0.24 0.22 0.12 0
BLM
dat %>%
select(sblm_1:sblm_4) %>%
psych::alpha(.)
Reliability analysis
Call: psych::alpha(x = .)
lower alpha upper 95% confidence boundaries
0.95 0.96 0.97
Reliability if an item is dropped:
Item statistics
Non missing response frequency for each item
1 2 3 4 5 6 7 miss
sblm_1 0.16 0.21 0.19 0.09 0.15 0.12 0.08 0
sblm_2 0.18 0.24 0.21 0.08 0.13 0.09 0.07 0
sblm_3 0.21 0.19 0.20 0.08 0.11 0.11 0.09 0
sblm_4 0.22 0.23 0.18 0.09 0.09 0.10 0.08 0
SOE
dat %>%
select(soe_1:soe_9) %>%
psych::alpha(.)
Reliability analysis
Call: psych::alpha(x = .)
lower alpha upper 95% confidence boundaries
0.91 0.92 0.93
Reliability if an item is dropped:
Item statistics
Non missing response frequency for each item
1 2 3 4 5 6 7 miss
soe_1 0.03 0.09 0.11 0.11 0.29 0.27 0.10 0
soe_2 0.03 0.06 0.07 0.09 0.26 0.33 0.15 0
soe_3 0.05 0.06 0.12 0.12 0.28 0.27 0.10 0
soe_4 0.05 0.07 0.10 0.11 0.27 0.28 0.11 0
soe_5 0.01 0.04 0.08 0.09 0.36 0.31 0.10 0
soe_6 0.01 0.05 0.08 0.12 0.30 0.30 0.13 0
soe_7 0.02 0.05 0.09 0.10 0.30 0.30 0.13 0
soe_8 0.01 0.03 0.06 0.10 0.26 0.36 0.18 0
soe_9 0.01 0.04 0.09 0.13 0.28 0.32 0.13 0
Job Satisfaction
dat %>%
select(jobsat_1:jobsat_3) %>%
psych::alpha(.)
Reliability analysis
Call: psych::alpha(x = .)
lower alpha upper 95% confidence boundaries
0.95 0.96 0.97
Reliability if an item is dropped:
Item statistics
Non missing response frequency for each item
1 2 3 4 5 6 7 miss
jobsat_1 0.06 0.08 0.07 0.05 0.23 0.34 0.17 0
jobsat_2r 0.05 0.08 0.09 0.07 0.14 0.29 0.27 0
jobsat_3 0.04 0.06 0.07 0.06 0.21 0.34 0.19 0
Affective Commitment
dat %>%
select(acommit_1:acommit_6) %>%
psych::alpha(.)
Reliability analysis
Call: psych::alpha(x = .)
lower alpha upper 95% confidence boundaries
0.92 0.93 0.94
Reliability if an item is dropped:
Item statistics
Non missing response frequency for each item
1 2 3 4 5 6 7 miss
acommit_1 0.13 0.10 0.08 0.14 0.18 0.25 0.12 0
acommit_2 0.13 0.15 0.11 0.14 0.26 0.15 0.05 0
acommit_3 0.07 0.10 0.14 0.08 0.18 0.25 0.16 0
acommit_4 0.10 0.08 0.15 0.11 0.22 0.18 0.16 0
acommit_5 0.09 0.09 0.11 0.10 0.22 0.19 0.19 0
acommit_6 0.11 0.10 0.11 0.15 0.24 0.18 0.10 0
Turnover Intentions
dat %>%
select(tointent_1:tointent_2) %>%
psych::alpha(.)
data length [16] is not a sub-multiple or multiple of the number of columns [10]
Reliability analysis
Call: psych::alpha(x = .)
lower alpha upper 95% confidence boundaries
0.9 0.92 0.93
Reliability if an item is dropped:
Item statistics
Non missing response frequency for each item
1 2 3 4 5 6 7 miss
tointent_1 0.25 0.26 0.11 0.08 0.10 0.10 0.10 0
tointent_2 0.28 0.20 0.12 0.11 0.11 0.06 0.12 0
Burnout
dat %>%
select(diseng_1r:exhaust_8r) %>%
psych::alpha(.)
Reliability analysis
Call: psych::alpha(x = .)
lower alpha upper 95% confidence boundaries
0.92 0.93 0.94
Reliability if an item is dropped:
Item statistics
Non missing response frequency for each item
1 2 3 4 5 6 7 miss
diseng_1r 0.07 0.24 0.35 0.07 0.12 0.11 0.05 0
exhaust_1 0.03 0.08 0.08 0.07 0.29 0.28 0.16 0
diseng_2 0.17 0.25 0.15 0.10 0.13 0.09 0.09 0
exhaust_2 0.13 0.21 0.15 0.13 0.18 0.13 0.07 0
exhaust_3r 0.15 0.33 0.32 0.09 0.05 0.04 0.01 0
diseng_3 0.11 0.22 0.18 0.14 0.19 0.10 0.06 0
diseng_4r 0.10 0.29 0.27 0.10 0.11 0.08 0.05 0
exhaust_4 0.09 0.21 0.20 0.12 0.18 0.12 0.08 0
diseng_5 0.08 0.15 0.13 0.14 0.25 0.16 0.08 0
exhaust_5r 0.08 0.24 0.30 0.13 0.11 0.09 0.03 0
diseng_6 0.29 0.26 0.15 0.09 0.10 0.07 0.03 0
exhaust_6 0.11 0.17 0.16 0.13 0.21 0.11 0.09 0
diseng_7r 0.03 0.10 0.22 0.09 0.15 0.21 0.19 0
exhaust_7r 0.20 0.43 0.24 0.08 0.02 0.01 0.01 0
diseng_8r 0.07 0.18 0.27 0.19 0.13 0.10 0.05 0
exhaust_8r 0.05 0.21 0.29 0.16 0.14 0.08 0.06 0
Burnout: Disengagement
dat %>%
select(diseng_1r, diseng_2, diseng_3, diseng_4r, diseng_5, diseng_6, diseng_7r, diseng_8r) %>%
psych::alpha(.)
Reliability analysis
Call: psych::alpha(x = .)
lower alpha upper 95% confidence boundaries
0.86 0.88 0.9
Reliability if an item is dropped:
Item statistics
Non missing response frequency for each item
1 2 3 4 5 6 7 miss
diseng_1r 0.07 0.24 0.35 0.07 0.12 0.11 0.05 0
diseng_2 0.17 0.25 0.15 0.10 0.13 0.09 0.09 0
diseng_3 0.11 0.22 0.18 0.14 0.19 0.10 0.06 0
diseng_4r 0.10 0.29 0.27 0.10 0.11 0.08 0.05 0
diseng_5 0.08 0.15 0.13 0.14 0.25 0.16 0.08 0
diseng_6 0.29 0.26 0.15 0.09 0.10 0.07 0.03 0
diseng_7r 0.03 0.10 0.22 0.09 0.15 0.21 0.19 0
diseng_8r 0.07 0.18 0.27 0.19 0.13 0.10 0.05 0
Burnout: Exhaustion
dat %>%
select(exhaust_1, exhaust_2, exhaust_3r, exhaust_4, exhaust_5r, exhaust_6, exhaust_7r, exhaust_8r) %>%
psych::alpha(.)
Reliability analysis
Call: psych::alpha(x = .)
lower alpha upper 95% confidence boundaries
0.86 0.87 0.89
Reliability if an item is dropped:
Item statistics
Non missing response frequency for each item
1 2 3 4 5 6 7 miss
exhaust_1 0.03 0.08 0.08 0.07 0.29 0.28 0.16 0
exhaust_2 0.13 0.21 0.15 0.13 0.18 0.13 0.07 0
exhaust_3r 0.15 0.33 0.32 0.09 0.05 0.04 0.01 0
exhaust_4 0.09 0.21 0.20 0.12 0.18 0.12 0.08 0
exhaust_5r 0.08 0.24 0.30 0.13 0.11 0.09 0.03 0
exhaust_6 0.11 0.17 0.16 0.13 0.21 0.11 0.09 0
exhaust_7r 0.20 0.43 0.24 0.08 0.02 0.01 0.01 0
exhaust_8r 0.05 0.21 0.29 0.16 0.14 0.08 0.06 0
****Alpha improves to .88 if Item 7r dropped
OCBs
dat %>%
select(ocb_1:ocb_10) %>%
psych::alpha(.)
Reliability analysis
Call: psych::alpha(x = .)
lower alpha upper 95% confidence boundaries
0.83 0.85 0.87
Reliability if an item is dropped:
Item statistics
Non missing response frequency for each item
1 2 3 4 5 miss
ocb_1 0.07 0.28 0.28 0.27 0.09 0
ocb_2 0.05 0.20 0.35 0.30 0.09 0
ocb_3 0.11 0.35 0.31 0.17 0.06 0
ocb_4 0.03 0.16 0.32 0.33 0.16 0
ocb_5 0.04 0.20 0.38 0.30 0.08 0
ocb_6 0.05 0.14 0.34 0.31 0.16 0
ocb_7 0.16 0.27 0.33 0.18 0.07 0
ocb_8 0.25 0.30 0.31 0.12 0.02 0
ocb_9 0.38 0.33 0.19 0.07 0.02 0
ocb_10 0.19 0.26 0.25 0.22 0.08 0
CWBs
dat %>%
select(cwb_1:cwb_10) %>%
psych::alpha(.)
Reliability analysis
Call: psych::alpha(x = .)
lower alpha upper 95% confidence boundaries
0.79 0.82 0.84
Reliability if an item is dropped:
Item statistics
Non missing response frequency for each item
1 2 3 4 5 miss
cwb_1 0.81 0.14 0.04 0.01 0.00 0
cwb_2 0.39 0.35 0.15 0.08 0.03 0
cwb_3 0.67 0.20 0.06 0.04 0.02 0
cwb_4 0.55 0.32 0.09 0.02 0.02 0
cwb_5 0.49 0.46 0.04 0.01 0.00 0
cwb_6 0.86 0.09 0.03 0.01 0.00 0
cwb_7 0.85 0.11 0.02 0.00 0.01 0
cwb_8 0.63 0.28 0.05 0.02 0.01 0
cwb_9 0.81 0.16 0.02 0.01 0.00 0
cwb_10 0.82 0.14 0.03 0.00 0.01 0
POS
dat %>%
select(pos_1:pos_8) %>%
psych::alpha(.)
Reliability analysis
Call: psych::alpha(x = .)
lower alpha upper 95% confidence boundaries
0.94 0.94 0.95
Reliability if an item is dropped:
Item statistics
Non missing response frequency for each item
1 2 3 4 5 6 7 miss
pos_1 0.09 0.12 0.10 0.13 0.24 0.22 0.09 0
pos_2 0.03 0.06 0.07 0.09 0.30 0.27 0.17 0
pos_3 0.08 0.08 0.08 0.14 0.25 0.23 0.14 0
pos_4 0.01 0.04 0.05 0.13 0.32 0.32 0.14 0
pos_5 0.05 0.09 0.12 0.17 0.26 0.20 0.11 0
pos_6 0.10 0.08 0.17 0.16 0.19 0.18 0.12 0
pos_7 0.06 0.09 0.10 0.15 0.20 0.22 0.18 0
pos_8 0.07 0.07 0.12 0.15 0.27 0.21 0.11 0
Hypothesis Tests
Hypothesis 1
Employee HR attributions are related to employee perceptions of organizational dehumanization. Specifically, (a) employees who tend to make employee-centric attributions perceive low levels of dehumanization whereas (b) employees who tend to make organizationcentric attributions perceive high levels of dehumanization.
cor.test(dat$wbatt, dat$orgdehum, method = "pearson")
Pearson's product-moment correlation
data: dat$wbatt and dat$orgdehum
t = -13, df = 398, p-value <2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.6121 -0.4742
sample estimates:
cor
-0.5468
cor.test(dat$exploitatt, dat$orgdehum, method = "pearson")
Pearson's product-moment correlation
data: dat$exploitatt and dat$orgdehum
t = 18, df = 398, p-value <2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.6101 0.7191
sample estimates:
cor
0.6681
Hypothesis 1 is supported.
dat %>%
ggplot(aes(x = wbatt, y = orgdehum)) + geom_point() + geom_smooth(method = "lm") +
scale_x_continuous("Employee-centric HR Attributions", breaks = c(1:7)) +
scale_y_continuous("Organizaitonal Dehumanization", breaks = c(1:7))

dat %>%
ggplot(aes(x = exploitatt, y = orgdehum)) + geom_point() + geom_smooth(method = "lm") +
scale_x_continuous("Organization-centric HR Attributions", breaks = c(1:7)) +
scale_y_continuous("Organizaitonal Dehumanization", breaks = c(1:7))

Since previous data exploration revealed that variables of interest are non-normally distributed, conduct two additional tests to affirm results:
cor.test(dat$wbatt, dat$orgdehum, method = "kendall")
Kendall's rank correlation tau
data: dat$wbatt and dat$orgdehum
z = -12, p-value <2e-16
alternative hypothesis: true tau is not equal to 0
sample estimates:
tau
-0.4042
cor.test(dat$exploitatt, dat$orgdehum, method = "kendall")
Kendall's rank correlation tau
data: dat$exploitatt and dat$orgdehum
z = 15, p-value <2e-16
alternative hypothesis: true tau is not equal to 0
sample estimates:
tau
0.5061
plot(lm(orgdehum ~ exploitatt, data = dat))




plot(lm(orgdehum ~ wbatt, data = dat))




Kendall’s tau aligns with Pearson’s r and no significant abnormalities spotted in the diagnostic plots.
Plot 1 (Residausl vs Fitted) examines linearity.
Plot 2 (Normal Q-Q) examines normality of residuals.
Plot 3 (Scale-Location) examines heterscedasticity.
Plot 4 (Residuals vs Leverage) examines Cook’s distance.
Hypothesis 2
Supervisor bottom-line mentality is positively related to employee perceptions of organizational dehumanization.
cor.test(dat$sblm, dat$orgdehum, method = "pearson")
Pearson's product-moment correlation
data: dat$sblm and dat$orgdehum
t = 21, df = 398, p-value <2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.6689 0.7639
sample estimates:
cor
0.7198
Hypothesis 2 is supported.
dat %>%
ggplot(aes(x = sblm, y = orgdehum)) + geom_point() + geom_smooth(method = "lm") +
scale_x_continuous("Supervisor's Bottom-line Mentality", breaks = c(1:7)) +
scale_y_continuous("Organizaitonal Dehumanization", breaks = c(1:7))

cor.test(dat$sblm, dat$orgdehum, method = "kendall")
Kendall's rank correlation tau
data: dat$sblm and dat$orgdehum
z = 16, p-value <2e-16
alternative hypothesis: true tau is not equal to 0
sample estimates:
tau
0.5519
plot(lm(orgdehum ~ sblm, data = dat))




Hypothesis 3
Supervisor bottom-line mentality is related to HR attributions such that (a) employees with high BLM supervisors are more likely to form organization-centric attributions and (b) employees with low BLM supervisors are more likely to form employee-centric attributions.
cor.test(dat$sblm, dat$exploitatt, method = "pearson")
Pearson's product-moment correlation
data: dat$sblm and dat$exploitatt
t = 15, df = 399, p-value <2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.5432 0.6669
sample estimates:
cor
0.6087
cor.test(dat$sblm, dat$wbatt, method = "pearson")
Pearson's product-moment correlation
data: dat$sblm and dat$wbatt
t = -8.8, df = 399, p-value <2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.4812 -0.3168
sample estimates:
cor
-0.4022
Hypothesis 3 is supported.
dat %>%
ggplot(aes(x = sblm, y = exploitatt)) + geom_point() + geom_smooth(method = "lm") +
scale_x_continuous("Supervisor's Bottom-line Mentality", breaks = c(1:7)) +
scale_y_continuous("Organization-centric HR Attributions", breaks = c(1:7))

dat %>%
ggplot(aes(x = sblm, y = wbatt)) + geom_point() + geom_smooth(method = "lm") +
scale_x_continuous("Supervisor's Bottom-line Mentality", breaks = c(1:7)) +
scale_y_continuous("Employee-centric HR Attributions", breaks = c(1:7))

cor.test(dat$sblm, dat$exploitatt, method = "kendall")
Kendall's rank correlation tau
data: dat$sblm and dat$exploitatt
z = 13, p-value <2e-16
alternative hypothesis: true tau is not equal to 0
sample estimates:
tau
0.4773
cor.test(dat$sblm, dat$wbatt, method = "kendall")
Kendall's rank correlation tau
data: dat$sblm and dat$wbatt
z = -8.1, p-value = 4e-16
alternative hypothesis: true tau is not equal to 0
sample estimates:
tau
-0.2891
plot(lm(exploitatt ~ sblm, data = dat))




plot(lm(wbatt ~ sblm, data = dat))




Hypothesis 4
Supervisor bottom-line mentality has a positive indirect effect on employee perceptions of organizational dehumanization through HR attributions. Specifically, supervisor BLM relates to organizational dehumanization through its (a) positive effect on organizationcentric attributions and (b) negative effect on employee-centric attributions.
summary(lm(exploitatt ~ sblm, data = dat))
Call:
lm(formula = exploitatt ~ sblm, data = dat)
Residuals:
Min 1Q Median 3Q Max
-3.644 -0.826 -0.087 0.769 3.976
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.5387 0.1342 11.5 <2e-16 ***
sblm 0.5401 0.0352 15.3 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.27 on 399 degrees of freedom
Multiple R-squared: 0.371, Adjusted R-squared: 0.369
F-statistic: 235 on 1 and 399 DF, p-value: <2e-16
summary(mediate(orgdehum ~ sblm + (exploitatt), data = dat, n.iter = 10000, zero = TRUE), digits = 4)
Call: mediate(y = orgdehum ~ sblm + (exploitatt), data = dat, n.iter = 10000,
zero = TRUE)
Direct effect estimates (traditional regression) (c')
R = 0.7762 R2 = 0.6024 F = 301.5 on 2 and 398 DF p-value: 1.921e-80
Total effect estimates (c)
'a' effect estimates
'b' effect estimates
'ab' effect estimates (through mediators)

Confirming the F-statistic can be calculate for later.
df1 <- k <- length(c("b", "c"))
n <- 400
df2 <- n - k
r2 <- .6024
fstat <- (r2/(1-r2))*(df2/df1)
data.frame("F-statistic" = fstat, "df1" = df1, "df2" = df2)
summary(lm(wbatt ~ sblm, data = dat))
Call:
lm(formula = wbatt ~ sblm, data = dat)
Residuals:
Min 1Q Median 3Q Max
-4.362 -1.062 0.163 1.163 3.938
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 5.7449 0.1663 34.54 <2e-16 ***
sblm -0.3832 0.0437 -8.78 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.58 on 399 degrees of freedom
Multiple R-squared: 0.162, Adjusted R-squared: 0.16
F-statistic: 77 on 1 and 399 DF, p-value: <2e-16
summary(mediate(orgdehum ~ sblm + (wbatt), data = dat, n.iter = 10000, zero = TRUE), digits = 4)
Call: mediate(y = orgdehum ~ sblm + (wbatt), data = dat, n.iter = 10000,
zero = TRUE)
Direct effect estimates (traditional regression) (c')
R = 0.7732 R2 = 0.5979 F = 295.9 on 2 and 398 DF p-value: 1.827e-79
Total effect estimates (c)
'a' effect estimates
'b' effect estimates
'ab' effect estimates (through mediators)

Confirming the F-statistic can be calculate for later.
df1 <- k <- length(c("b", "c"))
n <- 400
df2 <- n - k
r2 <- .5979
fstat <- (r2/(1-r2))*(df2/df1)
data.frame("F-statistic" = fstat, "df1" = df1, "df2" = df2)
Since the psych::mediate function appears to only calculate percentile bootstraps and not bias-corrected bootstraps, rerun analysis in lavaan.
indirect.exploit <- '
# direct effect
orgdehum ~ c*sblm
# mediator
exploitatt ~ a*sblm
orgdehum ~ b*exploitatt
# indirect effect
ab := a*b'
indirect.exploit.fit <- sem(indirect.exploit, data = dat, se = "boot", bootstrap = 10000, meanstructure = TRUE)
parameterEstimates(indirect.exploit.fit, boot.ci.type = "perc")
parameterEstimates(indirect.exploit.fit, boot.ci.type = "bca.simple")
summary(indirect.exploit.fit, standardized = FALSE)
lavaan 0.6-7 ended normally after 18 iterations
Estimator ML
Optimization method NLMINB
Number of free parameters 7
Used Total
Number of observations 400 401
Model Test User Model:
Test statistic 0.000
Degrees of freedom 0
Parameter Estimates:
Standard errors Bootstrap
Number of requested bootstrap draws 10000
Number of successful bootstrap draws 10000
Regressions:
Estimate Std.Err z-value P(>|z|)
orgdehum ~
sblm (c) 0.410 0.040 10.284 0.000
exploitatt ~
sblm (a) 0.539 0.036 14.908 0.000
orgdehum ~
exploitatt (b) 0.340 0.046 7.385 0.000
Intercepts:
Estimate Std.Err z-value P(>|z|)
.orgdehum 1.261 0.106 11.861 0.000
.exploitatt 1.540 0.125 12.363 0.000
Variances:
Estimate Std.Err z-value P(>|z|)
.orgdehum 0.879 0.071 12.459 0.000
.exploitatt 1.615 0.127 12.674 0.000
Defined Parameters:
Estimate Std.Err z-value P(>|z|)
ab 0.183 0.028 6.467 0.000
Calculating the F-statistic
df1 <- k <- length(c("b", "c"))
n <- nobs(indirect.exploit.fit)
df2 <- n - k
r2 <- inspect(indirect.exploit.fit, "rsquare")[[1]]
fstat <- (r2/(1-r2))*(df2/df1) # F-statistic
data.frame("F-statistic" = fstat, "df1" = df1, "df2" = df2)
indirect.wb <- '
# direct effect
orgdehum ~ c*sblm
# mediator
wbatt ~ a*sblm
orgdehum ~ b*wbatt
# indirect effect
ab := a*b'
indirect.wb.fit <- sem(indirect.wb, data = dat, se = "boot", bootstrap = 10000, meanstructure = TRUE)
parameterEstimates(indirect.wb.fit, boot.ci.type = "perc")
parameterEstimates(indirect.wb.fit, boot.ci.type = "bca.simple")
summary(indirect.wb.fit, standardized = FALSE)
lavaan 0.6-7 ended normally after 19 iterations
Estimator ML
Optimization method NLMINB
Number of free parameters 7
Used Total
Number of observations 400 401
Model Test User Model:
Test statistic 0.000
Degrees of freedom 0
Parameter Estimates:
Standard errors Bootstrap
Number of requested bootstrap draws 10000
Number of successful bootstrap draws 10000
Regressions:
Estimate Std.Err z-value P(>|z|)
orgdehum ~
sblm (c) 0.491 0.033 14.851 0.000
wbatt ~
sblm (a) -0.384 0.049 -7.830 0.000
orgdehum ~
wbatt (b) -0.265 0.036 -7.276 0.000
Intercepts:
Estimate Std.Err z-value P(>|z|)
.orgdehum 3.307 0.262 12.625 0.000
.wbatt 5.745 0.175 32.854 0.000
Variances:
Estimate Std.Err z-value P(>|z|)
.orgdehum 0.891 0.071 12.486 0.000
.wbatt 2.484 0.165 15.039 0.000
Defined Parameters:
Estimate Std.Err z-value P(>|z|)
ab 0.102 0.020 5.116 0.000
Calculating the F-statistic
df1 <- k <- length(c("b", "c"))
n <- nobs(indirect.wb.fit)
df2 <- n - k
r2 <- inspect(indirect.wb.fit, "rsquare")[[1]]
fstat <- (r2/(1-r2))*(df2/df1) # F-statistic
data.frame("F-statistic" = fstat, "df1" = df1, "df2" = df2)
Hypothesis 4 is supported.
Hypothesis 5
Supervisor organizational embodiment moderates the positive relationship between supervisor bottom-line mentality and employee perceptions of organizational dehumanization. Specifically, the relationship between supervisor BLM and organizational dehumanization should be more (less) positive at high (low) levels of supervisor organizational embodiment.
summary(lm(orgdehum ~ sblmc*soec, data = dat))
Call:
lm(formula = orgdehum ~ sblmc * soec, data = dat)
Residuals:
Min 1Q Median 3Q Max
-3.221 -0.632 -0.111 0.620 3.015
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.8095 0.0489 77.89 < 2e-16 ***
sblmc 0.5440 0.0275 19.81 < 2e-16 ***
soec -0.3489 0.0429 -8.13 5.6e-15 ***
sblmc:soec 0.0693 0.0210 3.30 0.001 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.95 on 396 degrees of freedom
(1 observation deleted due to missingness)
Multiple R-squared: 0.595, Adjusted R-squared: 0.592
F-statistic: 194 on 3 and 396 DF, p-value: <2e-16
Plot Interaction (Factor Predictor)
mod1 <- lm(orgdehum ~ sblmc*soec, data = dat)
inter.sd <- effect(c("sblmc*soec"), mod1,
xlevels = list(sblmc = c(-sd(dat$sblmc), +sd(dat$sblmc)),
soec = c(-sd(dat$soec), +sd(dat$soec))))
inter.sd <- as.data.frame(inter.sd)
# Create factors of the different variables
inter.sd$sblm <- factor(inter.sd$sblmc,
levels = c(-sd(dat$sblmc), +sd(dat$sblmc)),
labels = c("-1 SD SBLM", "+ 1 SD SBLM"))
inter.sd$soe <- factor(inter.sd$soec,
levels = c(-sd(dat$soe), +sd(dat$soec)),
labels = c("-1 SD SOE", "+1 SD SOE"))
# Plot
ggplot(data = inter.sd, aes(x = sblm, y = fit, group = soe, shape = soe, linetype = soe)) +
geom_point(size = 3) + geom_line(size = 1) +
scale_linetype_manual(values = c("dashed", "solid")) +
scale_shape_manual(values = c(17, 16)) +
scale_x_discrete("Supervisor's Bottom-Line Mentality") +
scale_y_continuous("Organizational Dehumanization", limits = c(1, 7), breaks = c(1:7)) +
guides(shape = guide_legend(title = NULL, reverse = TRUE, keywidth = 5),
linetype = guide_legend(title = NULL, reverse = TRUE, keywidth = 5)) +
theme(text = element_text(size = 13))

Plot Interaction (Continuous Predictor)
rm(mod1)
rm(inter.sd)
mod1 <- lm(orgdehum ~ sblm*soe, data = dat)
inter.sd <- effect(c("sblm*soe"), mod1,
xlevels = list(sblm = c(1:7),
soe = c(mean(dat$soe)-sd(dat$soe),
mean(dat$soe)+sd(dat$soe))))
inter.sd <- as.data.frame(inter.sd)
# Create factors of the moderator
inter.sd$soe <- factor(inter.sd$soe,
levels = c(mean(dat$soe)-sd(dat$soe), mean(dat$soe)+sd(dat$soec)),
labels = c("-1 SD SOE", "+1 SD SOE"))
# Plot
ggplot(data = inter.sd, aes(x = sblm, y = fit, group = soe, linetype = soe)) +
geom_line(size = 1) +
scale_linetype_manual(values = c("dashed", "solid")) +
scale_x_continuous("Supervisor's Bottom-Line Mentality", limits = c(1, 7), breaks = c(1:7)) +
scale_y_continuous("Organizational Dehumanization", limits = c(1, 7), breaks = c(1:7)) +
guides(shape = guide_legend(title = NULL, reverse = TRUE, keywidth = 5),
linetype = guide_legend(title = NULL, reverse = TRUE, keywidth = 5)) +
theme(text = element_text(size = 13))

Obtaining MSE for Reporting
c(crossprod(mod1$residuals))/length(mod1$residuals)
[1] 0.8942
Hypothesis 5 is supported.
- Notably, SOE exhibits a negative main effect on organizational dehumanization.
Hypothesis 6
Supervisor’s organizational embodiment moderates the relationship between supervisor bottom-line mentality and employee HR attributions. Specifically, high (low) supervisor BLM is more strongly related to organization-centric (employee-centric) HR attributions at high levels of supervisor’s organizational embodiment.
summary(lm(exploitatt ~ sblmc*soec, data = dat))
Call:
lm(formula = exploitatt ~ sblmc * soec, data = dat)
Residuals:
Min 1Q Median 3Q Max
-3.510 -0.796 -0.113 0.830 3.525
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.3817 0.0643 52.56 < 2e-16 ***
sblmc 0.5160 0.0361 14.28 < 2e-16 ***
soec -0.1928 0.0565 -3.41 0.00072 ***
sblmc:soec 0.0578 0.0276 2.10 0.03680 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.25 on 397 degrees of freedom
Multiple R-squared: 0.394, Adjusted R-squared: 0.39
F-statistic: 86.2 on 3 and 397 DF, p-value: <2e-16
Organization-Centric HR Attributions
Plot Interaction (Factor Predictor)
rm(inter.sd)
mod2 <- lm(exploitatt ~ sblmc*soec, data = dat)
inter.sd <- effect(c("sblmc*soec"), mod2,
xlevels = list(sblmc = c(-sd(dat$sblmc), +sd(dat$sblmc)),
soec = c(-sd(dat$soec), +sd(dat$soec))))
inter.sd <- as.data.frame(inter.sd)
# Create factors of the different variables
inter.sd$sblm <- factor(inter.sd$sblmc,
levels = c(-sd(dat$sblmc), sd(dat$sblmc)),
labels = c("-1 SD SBLM", "+ 1 SD SBLM"))
inter.sd$soe <- factor(inter.sd$soec,
levels = c(-sd(dat$soec), sd(dat$soec)),
labels = c("-1 SD SOE", "+1 SD SOE"))
# Plot
ggplot(data = inter.sd, aes(x = sblm, y = fit, group = soe, shape = soe, linetype = soe)) +
geom_point(size = 3) + geom_line(size = 1) +
scale_linetype_manual(values = c("dashed", "solid")) +
scale_shape_manual(values = c(17, 16)) +
scale_x_discrete("Supervisor's Bottom-Line Mentality") +
scale_y_continuous("Organization-centric HR Attributions", limits = c(1, 7), breaks = c(1:7)) +
guides(shape = guide_legend(title = NULL, reverse = TRUE, keywidth = 5),
linetype = guide_legend(title = NULL, reverse = TRUE, keywidth = 5)) +
theme(text = element_text(size = 13))

Plot Interaction (Continuous Predictor)
rm(mod2)
rm(inter.sd)
mod2 <- lm(exploitatt ~ sblm*soe, data = dat)
inter.sd <- effect(c("sblm*soe"), mod2,
xlevels = list(sblm = c(1:7),
soe = c(mean(dat$soe)-sd(dat$soe),
mean(dat$soe)+sd(dat$soe))))
inter.sd <- as.data.frame(inter.sd)
# Create factors of the moderator
inter.sd$soe <- factor(inter.sd$soe,
levels = c(mean(dat$soe)-sd(dat$soe), mean(dat$soe)+sd(dat$soec)),
labels = c("-1 SD SOE", "+1 SD SOE"))
# Plot
ggplot(data = inter.sd, aes(x = sblm, y = fit, group = soe, linetype = soe)) +
geom_line(size = 1) +
scale_linetype_manual(values = c("dashed", "solid")) +
scale_x_continuous("Supervisor's Bottom-Line Mentality", limits = c(1, 7), breaks = c(1:7)) +
scale_y_continuous("Organization-Centric HR Attributions", limits = c(1, 7), breaks = c(1:7)) +
guides(shape = guide_legend(title = NULL, reverse = TRUE, keywidth = 5),
linetype = guide_legend(title = NULL, reverse = TRUE, keywidth = 5)) +
theme(text = element_text(size = 13))

Obtaining MSE for Reporting
c(crossprod(mod2$residuals))/length(mod2$residuals)
[1] 1.552
Employee-Centric HR Attributions
summary(lm(wbatt ~ sblmc*soec, data = dat))
Call:
lm(formula = wbatt ~ sblmc * soec, data = dat)
Residuals:
Min 1Q Median 3Q Max
-5.229 -0.883 0.167 0.950 4.076
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 4.45692 0.07177 62.10 < 2e-16 ***
sblmc -0.27122 0.04032 -6.73 6.1e-11 ***
soec 0.66835 0.06308 10.60 < 2e-16 ***
sblmc:soec -0.00503 0.03080 -0.16 0.87
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.4 on 397 degrees of freedom
Multiple R-squared: 0.347, Adjusted R-squared: 0.342
F-statistic: 70.2 on 3 and 397 DF, p-value: <2e-16
Plot Interaction (Factor Predictor)
rm(inter.sd)
mod3 <- lm(wbatt ~ sblmc*soec, data = dat)
inter.sd <- effect(c("sblmc*soec"), mod3,
xlevels = list(sblmc = c(-sd(dat$sblmc), +sd(dat$sblmc)),
soec = c(-sd(dat$soec), +sd(dat$soec))))
inter.sd <- as.data.frame(inter.sd)
# Create factors of the different variables
inter.sd$sblm <- factor(inter.sd$sblmc,
levels = c(-sd(dat$sblmc), sd(dat$sblmc)),
labels = c("-1 SD SBLM", "+ 1 SD SBLM"))
inter.sd$soe <- factor(inter.sd$soec,
levels = c(-sd(dat$soec), sd(dat$soec)),
labels = c("-1 SD SOE", "+1 SD SOE"))
# Plot
ggplot(data = inter.sd, aes(x = sblm, y = fit, group = soe, shape = soe, linetype = soe)) +
geom_point(size = 3) + geom_line(size = 1) +
scale_linetype_manual(values = c("dashed", "solid")) +
scale_shape_manual(values = c(17, 16)) +
scale_x_discrete("Supervisor's Bottom-Line Mentality") +
scale_y_continuous("Employee-centric HR Attributions", limits = c(1, 7), breaks = c(1:7)) +
guides(shape = guide_legend(title = NULL, reverse = TRUE, keywidth = 5),
linetype = guide_legend(title = NULL, reverse = TRUE, keywidth = 5)) +
theme(text = element_text(size = 13))

Plot Interaction (Continuous Predictor)
rm(mod3)
rm(inter.sd)
mod3 <- lm(wbatt ~ sblm*soe, data = dat)
inter.sd <- effect(c("sblm*soe"), mod3,
xlevels = list(sblm = c(1:7),
soe = c(mean(dat$soe)-sd(dat$soe),
mean(dat$soe)+sd(dat$soe))))
inter.sd <- as.data.frame(inter.sd)
# Create factors of the moderator
inter.sd$soe <- factor(inter.sd$soe,
levels = c(mean(dat$soe)-sd(dat$soe), mean(dat$soe)+sd(dat$soec)),
labels = c("-1 SD SOE", "+1 SD SOE"))
# Plot
ggplot(data = inter.sd, aes(x = sblm, y = fit, group = soe, linetype = soe)) +
geom_line(size = 1) +
scale_linetype_manual(values = c("dashed", "solid")) +
scale_x_continuous("Supervisor's Bottom-Line Mentality", limits = c(1, 7), breaks = c(1:7)) +
scale_y_continuous("Employee-Centric HR Attributions", limits = c(1, 7), breaks = c(1:7)) +
guides(shape = guide_legend(title = NULL, reverse = TRUE, keywidth = 5),
linetype = guide_legend(title = NULL, reverse = TRUE, keywidth = 5)) +
theme(text = element_text(size = 13))

Obtaining MSE for Reporting
c(crossprod(mod3$residuals))/length(mod3$residuals)
[1] 1.932
Hypothesis 6 is partially supported.
Supported for organization-centric attributions.
Not supported for employee-centric attributions.
Notably, SOE appears to exhibit a substantial main effect. SOE positively impacts employee-centric attributions and negatively impacts organization-centric attributions.
Hypothesis 7
Supervisor’s organizational embodiment moderates the positive indirect effect of supervisor bottom-line mentality on employee perceptions of organizational dehumanization through HR attributions. Specifically, the indirect effect of supervisor BLM on organizational dehumanization is more positive at high levels of supervisor’s organizational embodiment.
Using lavaan::sem
Need to manually create interaction term for lavaan.
dat %<>%
mutate(sblmxsoe = sblm*soe) %>% # Uncentered
mutate(sblmcxsoec = sblmc*soec) # Centered
summary(lm(exploitatt ~ sblmc*soec, data = dat))
Call:
lm(formula = exploitatt ~ sblmc * soec, data = dat)
Residuals:
Min 1Q Median 3Q Max
-3.510 -0.796 -0.113 0.830 3.525
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.3817 0.0643 52.56 < 2e-16 ***
sblmc 0.5160 0.0361 14.28 < 2e-16 ***
soec -0.1928 0.0565 -3.41 0.00072 ***
sblmc:soec 0.0578 0.0276 2.10 0.03680 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.25 on 397 degrees of freedom
Multiple R-squared: 0.394, Adjusted R-squared: 0.39
F-statistic: 86.2 on 3 and 397 DF, p-value: <2e-16
df1 <- k <- length(c("a1", "a2", "a3"))
n <- 400
df2 <- n - k
r2 <- .394
fstat <- (r2/(1-r2))*(df2/df1) # F-statistic
data.frame("F-statistic" = fstat, "df1" = df1, "df2" = df2)
condindirect.exploit <- '
# direct effect
orgdehum ~ c*sblmc
# mediator
exploitatt ~ a1*sblmc + a2*soec + a3*sblmcxsoec
orgdehum ~ b*exploitatt
# indirect effect (index of moderated mediation)
ab := a3*b
# total effect
total := c + (a1 + a2 + a3)*b
'
condindirect.exploit.fit <- sem(condindirect.exploit, data = dat, se = "boot", bootstrap = 10000, meanstructure = TRUE)
parameterEstimates(condindirect.exploit.fit, boot.ci.type = "perc")
parameterEstimates(condindirect.exploit.fit, boot.ci.type = "bca.simple")
condindirect.exploit2 <- '
# direct effect
orgdehum ~ c*sblmc
# mediator
exploitatt ~ a1*sblmc + a2*soec + a3*sblmcxsoec
orgdehum ~ b*exploitatt
# indirect effect (index of moderated mediation)
ab := a3*b
# total effect
total := c + (a1 + a2 + a3)*b
# mean of centered SOE (for simple slopes)
soec ~ soec.mean*1
# variance of centered SOE (for simple slopes)
soec ~~ soec.var*soec
# indirect effects conditional on moderator (a1 + a3*a2.value)*b
indirect.SDbelow := a1*b + a3*b*(-sqrt(soec.var))
indirect.mean := a1*b + a3*soec.mean*b
indirect.SDabove := a1*b + a3*b*(sqrt(soec.var))
'
condindirect.exploit.fit2 <- sem(condindirect.exploit2, data = dat, se = "boot", bootstrap = 10000, meanstructure = TRUE)
lavaan WARNING: syntax contains parameters involving exogenous covariates; switching to fixed.x = FALSE
parameterEstimates(condindirect.exploit.fit2, boot.ci.type = "perc")
parameterEstimates(condindirect.exploit.fit2, boot.ci.type = "bca.simple")
summary(condindirect.exploit.fit, standardized = FALSE)
lavaan 0.6-7 ended normally after 18 iterations
Estimator ML
Optimization method NLMINB
Number of free parameters 9
Used Total
Number of observations 400 401
Model Test User Model:
Test statistic 55.362
Degrees of freedom 2
P-value (Chi-square) 0.000
Parameter Estimates:
Standard errors Bootstrap
Number of requested bootstrap draws 10000
Number of successful bootstrap draws 10000
Regressions:
Estimate Std.Err z-value P(>|z|)
orgdehum ~
sblmc (c) 0.410 0.040 10.255 0.000
exploitatt ~
sblmc (a1) 0.515 0.040 12.822 0.000
soec (a2) -0.193 0.063 -3.071 0.002
sblmcxsoc (a3) 0.057 0.028 2.083 0.037
orgdehum ~
exploittt (b) 0.340 0.047 7.262 0.000
Intercepts:
Estimate Std.Err z-value P(>|z|)
.orgdehum 2.635 0.165 15.976 0.000
.exploitatt 3.379 0.068 49.985 0.000
Variances:
Estimate Std.Err z-value P(>|z|)
.orgdehum 0.879 0.071 12.399 0.000
.exploitatt 1.554 0.115 13.519 0.000
Defined Parameters:
Estimate Std.Err z-value P(>|z|)
ab 0.020 0.010 1.903 0.057
total 0.538 0.041 13.136 0.000
inspect(condindirect.exploit.fit, "rsquare")
orgdehum exploitatt
0.602 0.394
Calculating F
df1 <- k <- length(c("b", "c"))
n <- nobs(condindirect.exploit.fit)
df2 <- n - k
r2 <- inspect(condindirect.exploit.fit, "rsquare")[[1]]
fstat <- (r2/(1-r2))*(df2/df1) # F-statistic
data.frame("F-statistic" = fstat, "df1" = df1, "df2" = df2)
Probing the Conditional Indirect Effect
w <- c(-sd(dat$soec), 0, +sd(dat$soec))
a1 <- coef(condindirect.exploit.fit)[["a1"]]
a3 <- coef(condindirect.exploit.fit)[["a3"]]
b <- coef(condindirect.exploit.fit)[["b"]]
condindirect.probe <- data.frame(w, a1, a3, b)
condindirect.probe %>%
rowwise() %>%
mutate(thetaxm = a1 + a3*w) %>%
mutate(indirect = thetaxm*b)
Results appear to match the ones above.
a3b is the difference between the conditional indirect effects between groups of people that differ by one unit in the moderator (Hayes, 2017, p. 453)
summary(lm(wbatt ~ sblmc*soec, data = dat))
Call:
lm(formula = wbatt ~ sblmc * soec, data = dat)
Residuals:
Min 1Q Median 3Q Max
-5.229 -0.883 0.167 0.950 4.076
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 4.45692 0.07177 62.10 < 2e-16 ***
sblmc -0.27122 0.04032 -6.73 6.1e-11 ***
soec 0.66835 0.06308 10.60 < 2e-16 ***
sblmc:soec -0.00503 0.03080 -0.16 0.87
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.4 on 397 degrees of freedom
Multiple R-squared: 0.347, Adjusted R-squared: 0.342
F-statistic: 70.2 on 3 and 397 DF, p-value: <2e-16
condindirect.wb <- '
# direct effect
orgdehum ~ c*sblmc
# mediator
wbatt ~ a1*sblmc + a2*soec + a3*sblmcxsoec
orgdehum ~ b*wbatt
# indirect effect (index of moderated mediation)
ab := a3*b
# total effect
total := c + (a1 + a2 + a3)*b
'
condindirect.wb.fit <- sem(condindirect.wb, data = dat, se = "boot", bootstrap = 10000, meanstructure = TRUE)
parameterEstimates(condindirect.wb.fit, boot.ci.type = "perc")
parameterEstimates(condindirect.wb.fit, boot.ci.type = "bca.simple")
summary(condindirect.wb.fit, standardized = FALSE)
lavaan 0.6-7 ended normally after 18 iterations
Estimator ML
Optimization method NLMINB
Number of free parameters 9
Used Total
Number of observations 400 401
Model Test User Model:
Test statistic 32.085
Degrees of freedom 2
P-value (Chi-square) 0.000
Parameter Estimates:
Standard errors Bootstrap
Number of requested bootstrap draws 10000
Number of successful bootstrap draws 10000
Regressions:
Estimate Std.Err z-value P(>|z|)
orgdehum ~
sblmc (c) 0.491 0.032 15.218 0.000
wbatt ~
sblmc (a1) -0.271 0.048 -5.624 0.000
soec (a2) 0.668 0.069 9.753 0.000
sblmcxsoc (a3) -0.005 0.037 -0.137 0.891
orgdehum ~
wbatt (b) -0.265 0.036 -7.349 0.000
Intercepts:
Estimate Std.Err z-value P(>|z|)
.orgdehum 4.953 0.174 28.447 0.000
.wbatt 4.456 0.074 59.947 0.000
Variances:
Estimate Std.Err z-value P(>|z|)
.orgdehum 0.891 0.071 12.497 0.000
.wbatt 1.936 0.153 12.641 0.000
Defined Parameters:
Estimate Std.Err z-value P(>|z|)
ab 0.001 0.010 0.136 0.892
total 0.387 0.050 7.694 0.000
inspect(condindirect.wb.fit, "rsquare")
orgdehum wbatt
0.597 0.347
Calculating F
df1 <- k <- length(c("b", "c"))
n <- nobs(condindirect.wb.fit)
df2 <- n - k
r2 <- inspect(condindirect.wb.fit, "rsquare")[[1]]
fstat <- (r2/(1-r2))*(df2/df1) # F-statistic
data.frame("F-statistic" = fstat, "df1" = df1, "df2" = df2)
Hypothesis 7 is partially supported.
Hypothesis 8
Organizational dehumanization is negatively related to job satisfaction.
cor.test(dat$orgdehum, dat$jobsat, method = "pearson")
Pearson's product-moment correlation
data: dat$orgdehum and dat$jobsat
t = -18, df = 398, p-value <2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.7286 -0.6225
sample estimates:
cor
-0.6791
Hypothesis 8 is supported.
dat %>%
ggplot(aes(x = orgdehum, y = jobsat)) + geom_point() + geom_smooth(method = "lm") +
scale_x_continuous("Organizational Dehumanization", breaks = c(1:7)) +
scale_y_continuous("Job Satisfaction", breaks = c(1:7))

cor.test(dat$orgdehum, dat$jobsat, method = "kendall")
Kendall's rank correlation tau
data: dat$orgdehum and dat$jobsat
z = -15, p-value <2e-16
alternative hypothesis: true tau is not equal to 0
sample estimates:
tau
-0.5254
plot(lm(jobsat ~ orgdehum, data = dat))




Diagnostic plots generally looks fine, although the scale-location plot indicates slight heteroscedasticity.
Hypothesis 9
Organizational dehumanization is negatively related to affective commitment.
cor.test(dat$orgdehum, dat$acommit, method = "pearson")
Pearson's product-moment correlation
data: dat$orgdehum and dat$acommit
t = -18, df = 398, p-value <2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.7257 -0.6187
sample estimates:
cor
-0.6758
Hypothesis 9 is supported.
dat %>%
ggplot(aes(x = orgdehum, y = acommit)) + geom_point() + geom_smooth(method = "lm") +
scale_x_continuous("Organizational Dehumanization", breaks = c(1:7)) +
scale_y_continuous("Affective Commitment", breaks = c(1:7))

cor.test(dat$orgdehum, dat$acommit, method = "kendall")
Kendall's rank correlation tau
data: dat$orgdehum and dat$acommit
z = -15, p-value <2e-16
alternative hypothesis: true tau is not equal to 0
sample estimates:
tau
-0.5002
plot(lm(acommit ~ orgdehum, data = dat))




Hypothesis 10
Organizational dehumanization is positively related to turnover intentions.
cor.test(dat$orgdehum, dat$tointent, method = "pearson")
Pearson's product-moment correlation
data: dat$orgdehum and dat$tointent
t = 17, df = 398, p-value <2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.5943 0.7070
sample estimates:
cor
0.6543
Hypothesis 10 is supported.
dat %>%
ggplot(aes(x = orgdehum, y = tointent)) + geom_point() + geom_smooth(method = "lm") +
scale_x_continuous("Organizational Dehumanization", breaks = c(1:7)) +
scale_y_continuous("Turnover Intentions", breaks = c(1:7))

cor.test(dat$orgdehum, dat$tointent, method = "kendall")
Kendall's rank correlation tau
data: dat$orgdehum and dat$tointent
z = 14, p-value <2e-16
alternative hypothesis: true tau is not equal to 0
sample estimates:
tau
0.4823
plot(lm(tointent ~ orgdehum, data = dat))




Hypothesis 11
Organizational dehumanization is positively related to burnout.
cor.test(dat$orgdehum, dat$burnout, method = "pearson")
Pearson's product-moment correlation
data: dat$orgdehum and dat$burnout
t = 18, df = 398, p-value <2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.6031 0.7137
sample estimates:
cor
0.662
Hypothesis 11 is supported.
dat %>%
ggplot(aes(x = orgdehum, y = burnout)) + geom_point() + geom_smooth(method = "lm") +
scale_x_continuous("Organizational Dehumanization", breaks = c(1:7)) +
scale_y_continuous("Burnout", breaks = c(1:7))

cor.test(dat$orgdehum, dat$burnout, method = "kendall")
Kendall's rank correlation tau
data: dat$orgdehum and dat$burnout
z = 14, p-value <2e-16
alternative hypothesis: true tau is not equal to 0
sample estimates:
tau
0.4785
plot(lm(burnout ~ orgdehum, data = dat))




Burnout Dimensions
cor.test(dat$orgdehum, dat$diseng, method = "pearson")
Pearson's product-moment correlation
data: dat$orgdehum and dat$diseng
t = 17, df = 398, p-value <2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.5813 0.6968
sample estimates:
cor
0.6427
cor.test(dat$orgdehum, dat$exhaust, method = "pearson")
Pearson's product-moment correlation
data: dat$orgdehum and dat$exhaust
t = 15, df = 398, p-value <2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.5399 0.6645
sample estimates:
cor
0.6059
Hypothesis 12
Organizational dehumanization is negatively related to task performance.
cor.test(dat$orgdehum, dat$perf, method = "pearson")
Pearson's product-moment correlation
data: dat$orgdehum and dat$perf
t = -2.3, df = 398, p-value = 0.02
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.21172 -0.01824
sample estimates:
cor
-0.1161
Hypothesis 12 is supported.
dat %>%
ggplot(aes(x = orgdehum, y = perf)) + geom_point() + geom_smooth(method = "lm") +
scale_x_continuous("Organizational Dehumanization", breaks = c(1:7)) +
scale_y_continuous("Task Performance", breaks = c(1:7))

However, the scatterplot indicates the variables do not have a bivariate normal distribution.
cor.test(dat$orgdehum, dat$perf, method = "kendall")
Kendall's rank correlation tau
data: dat$orgdehum and dat$perf
z = -3.5, p-value = 5e-04
alternative hypothesis: true tau is not equal to 0
sample estimates:
tau
-0.1238
plot(lm(perf ~ orgdehum, data = dat))




Q-Q plot indicates non-normality of residuals.
Hypothesis 13
Organizational dehumanization is negatively related to organizational citizenship behaviors.
cor.test(dat$orgdehum, dat$ocb, method = "pearson")
Pearson's product-moment correlation
data: dat$orgdehum and dat$ocb
t = -1.8, df = 397, p-value = 0.08
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.18443 0.01042
sample estimates:
cor
-0.08785
Hypothesis 13 is not supported.
dat %>%
ggplot(aes(x = orgdehum, y = ocb)) + geom_point() + geom_smooth(method = "lm") +
scale_x_continuous("Organizational Dehumanization", breaks = c(1:7)) +
scale_y_continuous("Organizaitonal Citizenship Behaviors", breaks = c(1:7))

cor.test(dat$orgdehum, dat$ocb, method = "kendall")
Kendall's rank correlation tau
data: dat$orgdehum and dat$ocb
z = -1.6, p-value = 0.1
alternative hypothesis: true tau is not equal to 0
sample estimates:
tau
-0.05507
plot(lm(ocb ~ orgdehum, data = dat))




Hypothesis 14
Organizational dehumanization is positively related to counterproductive work behaviors.
cor.test(dat$orgdehum, dat$cwb, method = "pearson")
Pearson's product-moment correlation
data: dat$orgdehum and dat$cwb
t = 7.3, df = 398, p-value = 2e-12
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.2539 0.4271
sample estimates:
cor
0.3434
Hypothesis 14 is supported.
dat %>%
ggplot(aes(x = orgdehum, y = cwb)) + geom_point() + geom_smooth(method = "lm") +
scale_x_continuous("Organizational Dehumanization", breaks = c(1:7)) +
scale_y_continuous("Counterproductive Work Behaviors", breaks = c(1:7))

cor.test(dat$orgdehum, dat$cwb, method = "kendall")
Kendall's rank correlation tau
data: dat$orgdehum and dat$cwb
z = 7.8, p-value = 8e-15
alternative hypothesis: true tau is not equal to 0
sample estimates:
tau
0.2743
plot(lm(cwb ~ orgdehum, data = dat))




Regressions with Controls
- Bolster correlation results with regression analyses including control variables
- Include demographic variables that were significantly correlate with focal variables:
- orgtype
- orglevels
- edu
- dirreport
- salary
Hypothesis 1
mod1 <- lm(orgdehum ~ wbatt + orgtype + orglevels + edu + dirreport + salary + hrpractices, data = dat)
summary(mod1)
Call:
lm(formula = orgdehum ~ wbatt + orgtype + orglevels + edu + dirreport +
salary + hrpractices, data = dat)
Residuals:
Min 1Q Median 3Q Max
-3.631 -0.732 -0.045 0.763 4.639
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 5.6907 0.3126 18.20 < 2e-16 ***
wbatt -0.4055 0.0419 -9.67 < 2e-16 ***
orgtype 0.5730 0.1563 3.67 0.00028 ***
orglevels 0.1914 0.0444 4.31 2e-05 ***
edu -0.0154 0.0654 -0.23 0.81444
dirreport 0.0199 0.1273 0.16 0.87581
salary -0.1223 0.0351 -3.48 0.00056 ***
hrpractices -0.0529 0.0280 -1.89 0.05929 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.19 on 392 degrees of freedom
(1 observation deleted due to missingness)
Multiple R-squared: 0.368, Adjusted R-squared: 0.357
F-statistic: 32.6 on 7 and 392 DF, p-value: <2e-16
mod2 <- lm(orgdehum ~ exploitatt + orgtype + orglevels + edu + dirreport + salary + hrpractices, data = dat)
summary(mod2)
Call:
lm(formula = orgdehum ~ exploitatt + orgtype + orglevels + edu +
dirreport + salary + hrpractices, data = dat)
Residuals:
Min 1Q Median 3Q Max
-3.236 -0.632 -0.101 0.601 4.364
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.0103 0.2921 10.31 < 2e-16 ***
exploitatt 0.5429 0.0343 15.84 < 2e-16 ***
orgtype 0.3485 0.1373 2.54 0.01149 *
orglevels 0.1306 0.0389 3.35 0.00088 ***
edu -0.0760 0.0566 -1.34 0.18036
dirreport -0.0723 0.1107 -0.65 0.51397
salary -0.0621 0.0308 -2.02 0.04439 *
hrpractices -0.1317 0.0208 -6.33 6.8e-10 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.04 on 392 degrees of freedom
(1 observation deleted due to missingness)
Multiple R-squared: 0.523, Adjusted R-squared: 0.514
F-statistic: 61.4 on 7 and 392 DF, p-value: <2e-16
Hypothesis 2
mod3 <- lm(orgdehum ~ sblm + orgtype + orglevels + edu + dirreport + salary + hrpractices, data = dat)
summary(mod3)
Call:
lm(formula = orgdehum ~ sblm + orgtype + orglevels + edu + dirreport +
salary + hrpractices, data = dat)
Residuals:
Min 1Q Median 3Q Max
-2.7654 -0.6868 -0.0824 0.5547 3.0360
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.1838 0.2912 7.50 4.3e-13 ***
sblm 0.5398 0.0294 18.36 < 2e-16 ***
orgtype 0.2842 0.1292 2.20 0.028 *
orglevels 0.2115 0.0358 5.92 7.2e-09 ***
edu 0.0363 0.0535 0.68 0.498
dirreport -0.1504 0.1042 -1.44 0.150
salary -0.0534 0.0289 -1.85 0.065 .
hrpractices -0.0945 0.0200 -4.73 3.1e-06 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.974 on 392 degrees of freedom
(1 observation deleted due to missingness)
Multiple R-squared: 0.579, Adjusted R-squared: 0.572
F-statistic: 77.2 on 7 and 392 DF, p-value: <2e-16
Hypothesis 3
mod4 <- lm(exploitatt ~ sblm + orgtype + orglevels + edu + dirreport + salary + hrpractices, data = dat)
summary(mod4)
Call:
lm(formula = exploitatt ~ sblm + orgtype + orglevels + edu +
dirreport + salary + hrpractices, data = dat)
Residuals:
Min 1Q Median 3Q Max
-3.606 -0.820 -0.084 0.830 4.015
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.9000 0.3729 2.41 0.016 *
sblm 0.5274 0.0376 14.01 < 2e-16 ***
orgtype 0.2708 0.1654 1.64 0.102
orglevels 0.2000 0.0458 4.37 1.6e-05 ***
edu 0.1214 0.0685 1.77 0.077 .
dirreport -0.0175 0.1334 -0.13 0.896
salary -0.0474 0.0370 -1.28 0.201
hrpractices -0.0229 0.0256 -0.89 0.372
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.25 on 393 degrees of freedom
Multiple R-squared: 0.405, Adjusted R-squared: 0.394
F-statistic: 38.2 on 7 and 393 DF, p-value: <2e-16
mod5 <- lm(wbatt ~ sblm + orgtype + orglevels + edu + dirreport + salary + hrpractices, data = dat)
summary(mod5)
Call:
lm(formula = wbatt ~ sblm + orgtype + orglevels + edu + dirreport +
salary + hrpractices, data = dat)
Residuals:
Min 1Q Median 3Q Max
-4.698 -0.872 0.113 0.982 3.829
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.0483 0.4102 7.43 6.8e-13 ***
sblm -0.2519 0.0414 -6.08 2.8e-09 ***
orgtype -0.1827 0.1820 -1.00 0.3159
orglevels -0.1651 0.0504 -3.28 0.0011 **
edu 0.0698 0.0753 0.93 0.3545
dirreport 0.1214 0.1467 0.83 0.4086
salary -0.0246 0.0407 -0.60 0.5463
hrpractices 0.3147 0.0281 11.19 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.37 on 393 degrees of freedom
Multiple R-squared: 0.376, Adjusted R-squared: 0.364
F-statistic: 33.8 on 7 and 393 DF, p-value: <2e-16
All Predictors
mod6 <- lm(orgdehum ~ sblm + exploitatt + wbatt + orgtype + orglevels + edu + dirreport + salary + hrpractices, data = dat)
summary(mod6)
Call:
lm(formula = orgdehum ~ sblm + exploitatt + wbatt + orgtype +
orglevels + edu + dirreport + salary + hrpractices, data = dat)
Residuals:
Min 1Q Median 3Q Max
-2.788 -0.538 -0.084 0.508 3.233
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.5641 0.2772 9.25 < 2e-16 ***
sblm 0.3473 0.0320 10.84 < 2e-16 ***
exploitatt 0.2679 0.0350 7.64 1.6e-13 ***
wbatt -0.2042 0.0318 -6.41 4.2e-10 ***
orgtype 0.1747 0.1140 1.53 0.12621
orglevels 0.1244 0.0324 3.83 0.00015 ***
edu 0.0180 0.0473 0.38 0.70330
dirreport -0.1216 0.0916 -1.33 0.18523
salary -0.0459 0.0255 -1.80 0.07281 .
hrpractices -0.0240 0.0202 -1.19 0.23423
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.856 on 390 degrees of freedom
(1 observation deleted due to missingness)
Multiple R-squared: 0.677, Adjusted R-squared: 0.669
F-statistic: 90.8 on 9 and 390 DF, p-value: <2e-16
Regression analyses indicate that predictors of interest predict organzational dehumanization even after controlling for covariates and each other.
Supplemental Analyses: Demographic Differences
Region
dat %>%
group_by(region) %>%
tally()
source("summarySE.R")
dat %>%
summarySE(., measurevar = "orgdehum", groupvars = "region", na.rm = TRUE)
NaNs produced
summary(aov(orgdehum ~ region, data = dat))
Df Sum Sq Mean Sq F value Pr(>F)
region 3 1 0.422 0.19 0.9
Residuals 395 879 2.226
2 observations deleted due to missingness
source("summarySE.R")
dat %>%
summarySE(., measurevar = "sblm", groupvars = "region", na.rm = TRUE)
NaNs produced
summary(aov(sblm ~ region, data = dat))
Df Sum Sq Mean Sq F value Pr(>F)
region 3 1 0.36 0.11 0.95
Residuals 396 1303 3.29
1 observation deleted due to missingness
source("summarySE.R")
dat %>%
summarySE(., measurevar = "exploitatt", groupvars = "region", na.rm = TRUE)
NaNs produced
summary(aov(exploitatt ~ region, data = dat))
Df Sum Sq Mean Sq F value Pr(>F)
region 3 2 0.572 0.22 0.88
Residuals 396 1021 2.577
1 observation deleted due to missingness
source("summarySE.R")
dat %>%
summarySE(., measurevar = "wbatt", groupvars = "region", na.rm = TRUE)
NaNs produced
summary(aov(wbatt ~ region, data = dat))
Df Sum Sq Mean Sq F value Pr(>F)
region 3 5 1.76 0.59 0.62
Residuals 396 1174 2.96
1 observation deleted due to missingness
No significant mean differences in variables of interest across regions.
Industry
source("summarySE.R")
dat %>%
summarySE(., measurevar = "orgdehum", groupvars = "industry", na.rm = TRUE)
NaNs produced
source("summarySE.R")
dat %>%
summarySE(., measurevar = "sblm", groupvars = "industry", na.rm = TRUE)
NaNs produced
source("summarySE.R")
dat %>%
summarySE(., measurevar = "exploitatt", groupvars = "industry", na.rm = TRUE)
NaNs produced
source("summarySE.R")
dat %>%
summarySE(., measurevar = "wbatt", groupvars = "industry", na.rm = TRUE)
NaNs produced
Note: Very low n-size for certain industries. Consider dropping groups.
Specifically, the following categories have N < 20:
dat %>%
group_by(industry) %>%
select(industry) %>%
count() %>%
filter(freq < 20)
ANOVA (Org Dehumanization)
Test for homogeneity of variance first. Use the non-parametric Fligner-Killeen Test.
fligner.test(orgdehum ~ industry, data = dat)
Fligner-Killeen test of homogeneity of variances
data: orgdehum by industry
Fligner-Killeen:med chi-squared = 15, df = 18, p-value = 0.6
fligner.test(sblm ~ industry, data = dat)
Fligner-Killeen test of homogeneity of variances
data: sblm by industry
Fligner-Killeen:med chi-squared = 19, df = 18, p-value = 0.4
fligner.test(exploitatt ~ industry, data = dat)
Fligner-Killeen test of homogeneity of variances
data: exploitatt by industry
Fligner-Killeen:med chi-squared = 16, df = 18, p-value = 0.6
fligner.test(wbatt ~ industry, data = dat)
Fligner-Killeen test of homogeneity of variances
data: wbatt by industry
Fligner-Killeen:med chi-squared = 7.5, df = 18, p-value = 1
summary(aov(orgdehum ~ industry, data = dat))
Df Sum Sq Mean Sq F value Pr(>F)
industry 18 97 5.41 2.62 0.00037 ***
Residuals 381 787 2.07
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
1 observation deleted due to missingness
Significant mean difference in organizational dehumanization between industries.
Tukey Test (Org Dehumanization)
tukey.odhindustry <- tidy(TukeyHSD(aov(orgdehum ~ industry, data = dat)))
tukey.odhindustry %>%
select(-term) %>%
filter(adj.p.value < .05)
None of the groups compared above had N < 20.
Create labels with capitalized letters for graphing
dat$industry <- as.factor(dat$industry)
Visualization (Org Dehumanization)
source("summarySE.R")
dat %>%
select(industry, orgdehum) %>%
filter(industry %in% c("arts, entertainment, recreation", "accommodation, food services")) %>%
group_by(industry) %>%
summarySE(., measurevar = "orgdehum", groupvars = "industry", na.rm = TRUE)
dat %>%
filter(industry %in% c("arts, entertainment, recreation", "accommodation, food services")) %>%
summarySE(., measurevar = "orgdehum", groupvars = "industry", na.rm = TRUE) %>%
ggplot(aes(x = industry, y = orgdehum, group = industry, fill = industry)) +
geom_bar(stat = "identity", width = 0.3) +
scale_fill_grey(start = .4, end = .8) +
geom_errorbar(aes(ymin = orgdehum - ci, ymax = orgdehum + ci), size = 0.5, width = 0.07) +
scale_x_discrete(labels = c("Accommodation, Food Services", "Arts, Entertainment, Recreation")) +
scale_y_continuous(expand = c(0,0), limits = c(0,7), breaks = c(1:7)) +
labs(x = "Industry", y = "Organizational Dehumanization") +
theme(text = element_text(size = 13)) + guides(fill = FALSE)

source("summarySE.R")
dat %>%
select(industry, orgdehum) %>%
filter(industry %in% c("finance, insurance", "accommodation, food services")) %>%
group_by(industry) %>%
summarySE(., measurevar = "orgdehum", groupvars = "industry", na.rm = TRUE)
dat %>%
filter(industry %in% c("finance, insurance", "accommodation, food services")) %>%
summarySE(., measurevar = "orgdehum", groupvars = "industry", na.rm = TRUE) %>%
ggplot(aes(x = industry, y = orgdehum, group = industry, fill = industry)) +
scale_fill_grey(start = .4, end = .8) +
geom_bar(stat = "identity", width = 0.3) +
geom_errorbar(aes(ymin = orgdehum - ci, ymax = orgdehum + ci), size = 0.5, width = 0.07) +
scale_x_discrete(labels = c("Accommodation, Food Services", "Finance, Insurance")) +
scale_y_continuous(expand = c(0,0), limits = c(0,7), breaks = c(1:7)) +
labs(x = "Industry", y = "Organizational Dehumanization") +
theme(text = element_text(size = 13)) + guides(fill = FALSE)

source("summarySE.R")
dat %>%
select(industry, orgdehum) %>%
filter(industry %in% c("retail trade", "arts, entertainment, recreation")) %>%
group_by(industry) %>%
summarySE(., measurevar = "orgdehum", groupvars = "industry", na.rm = TRUE)
dat %>%
filter(industry %in% c("retail trade", "arts, entertainment, recreation")) %>%
summarySE(., measurevar = "orgdehum", groupvars = "industry", na.rm = TRUE) %>%
ggplot(aes(x = industry, y = orgdehum, group = industry, fill = industry)) +
geom_bar(stat = "identity", width = 0.3) +
scale_fill_grey(start = .4, end = .8) +
geom_errorbar(aes(ymin = orgdehum - ci, ymax = orgdehum + ci), size = 0.5, width = 0.07) +
scale_x_discrete(labels = c("Arts, Entertainment, Recreation", "Retail Trade")) +
scale_y_continuous(expand = c(0,0), limits = c(0,7), breaks = c(1:7)) +
labs(x = "Industry", y = "Organizational Dehumanization") +
theme(text = element_text(size = 13)) + guides(fill = FALSE)

source("summarySE.R")
dat %>%
select(industry, orgdehum) %>%
filter(industry %in% c("retail trade", "educational services")) %>%
group_by(industry) %>%
summarySE(., measurevar = "orgdehum", groupvars = "industry", na.rm = TRUE)
dat %>%
filter(industry %in% c("retail trade", "educational services")) %>%
summarySE(., measurevar = "orgdehum", groupvars = "industry", na.rm = TRUE) %>%
ggplot(aes(x = industry, y = orgdehum, group = industry, fill = industry)) +
geom_bar(stat = "identity", width = 0.3) +
scale_fill_grey(start = .4, end = .8) +
geom_errorbar(aes(ymin = orgdehum - ci, ymax = orgdehum + ci), size = 0.5, width = 0.07) +
scale_x_discrete(labels = c("Educational Services", "Retail Trade")) +
scale_y_continuous(expand = c(0,0), limits = c(0,7), breaks = c(1:7)) +
labs(x = "Industry", y = "Organizational Dehumanization") +
theme(text = element_text(size = 13)) + guides(fill = FALSE)

source("summarySE.R")
dat %>%
select(industry, orgdehum) %>%
filter(industry %in% c("retail trade", "finance, insurance")) %>%
group_by(industry) %>%
summarySE(., measurevar = "orgdehum", groupvars = "industry", na.rm = TRUE)
dat %>%
filter(industry %in% c("retail trade", "finance, insurance")) %>%
summarySE(., measurevar = "orgdehum", groupvars = "industry", na.rm = TRUE) %>%
ggplot(aes(x = industry, y = orgdehum, group = industry, fill = industry)) +
geom_bar(stat = "identity", width = 0.3) +
scale_fill_grey(start = .4, end = .8) +
geom_errorbar(aes(ymin = orgdehum - ci, ymax = orgdehum + ci), size = 0.5, width = 0.07) +
scale_x_discrete(labels = c("Finance, Insurance", "Retail Trade")) +
scale_y_continuous(expand = c(0,0), limits = c(0,7), breaks = c(1:7)) +
labs(x = "Industry", y = "Organizational Dehumanization") +
theme(text = element_text(size = 13)) + guides(fill = FALSE)

ANOVA (BLM)
summary(aov(sblm ~ industry, data = dat))
Df Sum Sq Mean Sq F value Pr(>F)
industry 18 139 7.73 2.53 0.00059 ***
Residuals 382 1167 3.05
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Significant mean difference in BLM between industries.
Tukey Test (BLM)
tukey.sblmindustry <- tidy(TukeyHSD(aov(sblm ~ industry, data = dat)))
tukey.sblmindustry %>%
select(-term) %>%
filter(adj.p.value < .05)
Visualization (BLM)
source("summarySE.R")
dat %>%
select(industry, sblm) %>%
filter(industry %in% c("educational services", "accommodation, food services")) %>%
group_by(industry) %>%
summarySE(., measurevar = "sblm", groupvars = "industry", na.rm = TRUE)
dat %>%
filter(industry %in% c("educational services", "accommodation, food services")) %>%
summarySE(., measurevar = "sblm", groupvars = "industry", na.rm = TRUE) %>%
ggplot(aes(x = industry, y = sblm, group = industry, fill = industry)) +
geom_bar(stat = "identity", width = 0.3) +
scale_fill_grey(start = .4, end = .8) +
geom_errorbar(aes(ymin = sblm - ci, ymax = sblm + ci), size = 0.5, width = 0.07) +
scale_x_discrete(labels = c("Accommodation, Food Services", "Educational Services")) +
scale_y_continuous(expand = c(0,0), limits = c(0,7), breaks = c(1:7)) +
labs(x = "Industry", y = "Supervisor's Bottom-Line Mentality") +
theme(text = element_text(size = 13)) + guides(fill = FALSE)

source("summarySE.R")
dat %>%
select(industry, sblm) %>%
filter(industry %in% c("finance, insurance", "accommodation, food services")) %>%
group_by(industry) %>%
summarySE(., measurevar = "sblm", groupvars = "industry", na.rm = TRUE)
dat %>%
filter(industry %in% c("finance, insurance", "accommodation, food services")) %>%
summarySE(., measurevar = "sblm", groupvars = "industry", na.rm = TRUE) %>%
ggplot(aes(x = industry, y = sblm, group = industry, fill = industry)) +
geom_bar(stat = "identity", width = 0.3) +
scale_fill_grey(start = .4, end = .8) +
geom_errorbar(aes(ymin = sblm - ci, ymax = sblm + ci), size = 0.5, width = 0.07) +
scale_x_discrete(labels = c("Accommodation, Food Services", "Finance, Insurance")) +
scale_y_continuous(expand = c(0,0), limits = c(0,7), breaks = c(1:7)) +
labs(x = "Industry", y = "Supervisor's Bottom-Line Mentality") +
theme(text = element_text(size = 13)) + guides(fill = FALSE)

source("summarySE.R")
dat %>%
select(industry, sblm) %>%
filter(industry %in% c("retail trade", "educational services")) %>%
group_by(industry) %>%
summarySE(., measurevar = "sblm", groupvars = "industry", na.rm = TRUE)
dat %>%
filter(industry %in% c("retail trade", "educational services")) %>%
summarySE(., measurevar = "sblm", groupvars = "industry", na.rm = TRUE) %>%
ggplot(aes(x = industry, y = sblm, group = industry, fill = industry)) +
geom_bar(stat = "identity", width = 0.3) +
scale_fill_grey(start = .4, end = .8) +
geom_errorbar(aes(ymin = sblm - ci, ymax = sblm + ci), size = 0.5, width = 0.07) +
scale_x_discrete(labels = c("Educational Services", "Retail Trade")) +
scale_y_continuous(expand = c(0,0), limits = c(0,7), breaks = c(1:7)) +
labs(x = "Industry", y = "Supervisor's Bottom-Line Mentality") +
theme(text = element_text(size = 13)) + guides(fill = FALSE)

source("summarySE.R")
dat %>%
select(industry, sblm) %>%
filter(industry %in% c("retail trade", "finance, insurance")) %>%
group_by(industry) %>%
summarySE(., measurevar = "sblm", groupvars = "industry", na.rm = TRUE)
dat %>%
filter(industry %in% c("retail trade", "finance, insurance")) %>%
summarySE(., measurevar = "sblm", groupvars = "industry", na.rm = TRUE) %>%
ggplot(aes(x = industry, y = sblm, group = industry, fill = industry)) +
geom_bar(stat = "identity", width = 0.3) +
scale_fill_grey(start = .4, end = .8) +
geom_errorbar(aes(ymin = sblm - ci, ymax = sblm + ci), size = 0.5, width = 0.07) +
scale_x_discrete(labels = c("Finance, Insurance", "Retail Trade")) +
scale_y_continuous(expand = c(0,0), limits = c(0,7), breaks = c(1:7)) +
labs(x = "Industry", y = "Supervisor's Bottom-Line Mentality") +
theme(text = element_text(size = 13)) + guides(fill = FALSE)

ANOVA (HR Attributions)
summary(aov(exploitatt ~ industry, data = dat))
Df Sum Sq Mean Sq F value Pr(>F)
industry 18 71 3.94 1.57 0.064 .
Residuals 382 957 2.51
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
summary(aov(wbatt ~ industry, data = dat))
Df Sum Sq Mean Sq F value Pr(>F)
industry 18 79 4.36 1.51 0.084 .
Residuals 382 1107 2.90
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
No significant mean differences in attributions across industries. However, p-values may be considered “marginal”.
Marital Status
dat %>%
group_by(marital) %>%
tally()
dat %>%
group_by(marital) %>%
summarize(orgdehum = mean(orgdehum, na.rm = TRUE),
sblm = mean(sblm, na.rm = TRUE),
exploitatt = mean(exploitatt, na.rm = TRUE),
wbatt = mean(wbatt, na.rm = TRUE))
summary(aov(orgdehum ~ marital, data = dat))
Df Sum Sq Mean Sq F value Pr(>F)
marital 5 14 2.80 1.27 0.28
Residuals 394 870 2.21
1 observation deleted due to missingness
summary(aov(sblm ~ marital, data = dat))
Df Sum Sq Mean Sq F value Pr(>F)
marital 5 13 2.61 0.8 0.55
Residuals 395 1293 3.27
summary(aov(exploitatt ~ marital, data = dat))
Df Sum Sq Mean Sq F value Pr(>F)
marital 5 27 5.35 2.11 0.063 .
Residuals 395 1001 2.53
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
summary(aov(wbatt ~ marital, data = dat))
Df Sum Sq Mean Sq F value Pr(>F)
marital 5 31 6.23 2.13 0.061 .
Residuals 395 1154 2.92
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
No significant mean differences in variables of interest across marital status.
Race
dat %>%
select(race) %>%
group_by(race) %>%
tally()
dat %>%
group_by(race) %>%
summarize(orgdehum = mean(orgdehum, na.rm = TRUE),
sblm = mean(sblm, na.rm = TRUE),
exploitatt = mean(exploitatt, na.rm = TRUE),
wbatt = mean(wbatt, na.rm = TRUE))
summary(aov(orgdehum ~ race, data = dat))
Df Sum Sq Mean Sq F value Pr(>F)
race 4 7 1.78 0.8 0.52
Residuals 395 877 2.22
1 observation deleted due to missingness
summary(aov(sblm ~ race, data = dat))
Df Sum Sq Mean Sq F value Pr(>F)
race 4 18 4.57 1.41 0.23
Residuals 396 1287 3.25
summary(aov(exploitatt ~ race, data = dat))
Df Sum Sq Mean Sq F value Pr(>F)
race 4 22 5.47 2.15 0.074 .
Residuals 396 1006 2.54
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
summary(aov(wbatt ~ race, data = dat))
Df Sum Sq Mean Sq F value Pr(>F)
race 4 18 4.54 1.54 0.19
Residuals 396 1167 2.95
No significant mean differences in variables of interest across races. Notably, however, Black employees appear to differ slightly.
Org Type
Organization type (for-profit vs nonprofit) was correlated with several variables of interest.
Variable Preparation
dat %<>%
mutate(orgtype = recode_factor(orgtype, `1` = "For-profit",
`0` = "Nonprofit"))
Organization Type and Dehumanization
source("summarySE.R")
dat %>%
summarySE(., measurevar = "orgdehum", groupvars = "orgtype", na.rm = TRUE)
t.test(dat$orgdehum ~ dat$orgtype)
Welch Two Sample t-test
data: dat$orgdehum by dat$orgtype
t = 3.1, df = 142, p-value = 0.002
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
0.1969 0.8662
sample estimates:
mean in group For-profit mean in group Nonprofit
3.880 3.348
t.test(dat$orgdehum ~ dat$orgtype, var.equal = TRUE)
Two Sample t-test
data: dat$orgdehum by dat$orgtype
t = 2.9, df = 398, p-value = 0.004
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
0.174 0.889
sample estimates:
mean in group For-profit mean in group Nonprofit
3.880 3.348
Significant mean difference between groups. Tests assuming equal and unequal variances yield similar results.
source("summarySE.R")
dat %>%
summarySE(., measurevar = "orgdehum", groupvars = "orgtype", na.rm = TRUE) %>%
ggplot(aes(x = orgtype, y = orgdehum, group = orgtype, fill = orgtype)) +
geom_bar(stat = "identity", width = 0.3) +
scale_fill_grey(start = .4, end = .8) +
geom_errorbar(aes(ymin = orgdehum - ci, ymax = orgdehum + ci), size = 0.5, width = 0.07) +
scale_y_continuous(expand = c(0,0), limits = c(0,7), breaks = c(1:7)) +
labs(x = "Organization Type", y = "Organizational Dehumanization") +
theme(text = element_text(size = 13)) + guides(fill = FALSE)

Note: Error bars reflect confidence intervals.
Organization Type and Exploitation Attributions
source("summarySE.R")
dat %>%
summarySE(., measurevar = "exploitatt", groupvars = "orgtype", na.rm = TRUE)
t.test(dat$exploitatt ~ dat$orgtype)
Welch Two Sample t-test
data: dat$exploitatt by dat$orgtype
t = 3, df = 145, p-value = 0.003
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
0.1818 0.8933
sample estimates:
mean in group For-profit mean in group Nonprofit
3.461 2.924
t.test(dat$exploitatt ~ dat$orgtype, var.equal = TRUE)
Two Sample t-test
data: dat$exploitatt by dat$orgtype
t = 2.7, df = 399, p-value = 0.006
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
0.1522 0.9228
sample estimates:
mean in group For-profit mean in group Nonprofit
3.461 2.924
source("summarySE.R")
dat %>%
summarySE(., measurevar = "exploitatt", groupvars = "orgtype", na.rm = TRUE) %>%
ggplot(aes(x = orgtype, y = exploitatt, group = orgtype, fill = orgtype)) +
geom_bar(stat = "identity", width = 0.3) +
scale_fill_grey(start = .4, end = .8) +
geom_errorbar(aes(ymin = exploitatt - ci, ymax = exploitatt + ci), size = 0.5, width = 0.07) +
scale_y_continuous(expand = c(0,0), limits = c(0,7), breaks = c(1:7)) +
labs(x = "Organization Type", y = "Organization-Centric HR Attributions") +
theme(text = element_text(size = 13)) + guides(fill = FALSE)

Note: Error bars reflect confidence intervals.
Organization Type and BLM
source("summarySE.R")
dat %>%
summarySE(., measurevar = "sblm", groupvars = "orgtype", na.rm = TRUE)
t.test(dat$sblm ~ dat$orgtype)
Welch Two Sample t-test
data: dat$sblm by dat$orgtype
t = 3.5, df = 129, p-value = 7e-04
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
0.3298 1.1922
sample estimates:
mean in group For-profit mean in group Nonprofit
3.511 2.750
t.test(dat$sblm ~ dat$orgtype, var.equal = TRUE)
Two Sample t-test
data: dat$sblm by dat$orgtype
t = 3.5, df = 399, p-value = 6e-04
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
0.3291 1.1929
sample estimates:
mean in group For-profit mean in group Nonprofit
3.511 2.750
source("summarySE.R")
dat %>%
summarySE(., measurevar = "sblm", groupvars = "orgtype", na.rm = TRUE) %>%
ggplot(aes(x = orgtype, y = sblm, group = orgtype, fill = orgtype)) +
geom_bar(stat = "identity", width = 0.3) +
scale_fill_grey(start = .4, end = .8) +
geom_errorbar(aes(ymin = sblm - ci, ymax = sblm + ci), size = 0.5, width = 0.07) +
scale_y_continuous(expand = c(0,0), limits = c(0,7), breaks = c(1:7)) +
labs(x = "Organization Type", y = "Supervisor's Bottom-line Mentality") +
theme(text = element_text(size = 13)) + guides(fill = FALSE)

Note: Error bars reflect confidence intervals.
Org Levels
Org Levels and Variables of Interest
cor.test(dat$orglevels, dat$exploitatt, method = "spearman")
Cannot compute exact p-value with ties
Spearman's rank correlation rho
data: dat$orglevels and dat$exploitatt
S = 9192951, p-value = 0.004
alternative hypothesis: true rho is not equal to 0
sample estimates:
rho
0.1446
Output for Spearman’s rho yields a warning that data samples contains correlated ties. Kendall’s tau-b coefficient can handle ties (below).
cor.test(dat$orglevels, dat$exploitatt, method = "kendall")
Kendall's rank correlation tau
data: dat$orglevels and dat$exploitatt
z = 2.9, p-value = 0.004
alternative hypothesis: true tau is not equal to 0
sample estimates:
tau
0.1102
cor.test(dat$orglevels, dat$orgdehum, method = "spearman")
Cannot compute exact p-value with ties
Spearman's rank correlation rho
data: dat$orglevels and dat$orgdehum
S = 9286840, p-value = 0.01
alternative hypothesis: true rho is not equal to 0
sample estimates:
rho
0.1294
cor.test(dat$orglevels, dat$orgdehum, method = "kendall")
Kendall's rank correlation tau
data: dat$orglevels and dat$orgdehum
z = 2.6, p-value = 0.01
alternative hypothesis: true tau is not equal to 0
sample estimates:
tau
0.09593
Significant positive correlation between org levels and org dehumanization.
cor.test(dat$orglevels, dat$sblm, method = "kendall")
Kendall's rank correlation tau
data: dat$orglevels and dat$sblm
z = -0.71, p-value = 0.5
alternative hypothesis: true tau is not equal to 0
sample estimates:
tau
-0.02697
cor.test(dat$orglevels, dat$wbatt, method = "kendall")
Kendall's rank correlation tau
data: dat$orglevels and dat$wbatt
z = -0.4, p-value = 0.7
alternative hypothesis: true tau is not equal to 0
sample estimates:
tau
-0.01509
No significant rank correlation between org levels and BLM or well-being attributions.
Variable Preparation for Visualization
dat %<>%
mutate(orglevels = recode_factor(orglevels, `1` = "three or fewer levels",
`2` = "four levels",
`3` = "five levels",
`4` = "six levels",
`5` = "seven levels or more", .ordered = TRUE))
Org Levels and Exploitation Attributions
source("summarySE.R")
dat %>%
summarySE(., measurevar = "exploitatt", groupvars = "orglevels")
source("summarySE.R")
dat %>%
summarySE(., measurevar = "exploitatt", groupvars = "orglevels") %>%
ggplot(aes(x = orglevels, y = exploitatt, group = 1)) +
geom_errorbar(aes(ymin = exploitatt - ci, ymax = exploitatt + ci), width=.1) +
geom_line() + geom_point() +
scale_y_continuous(expand = c(0,0), limits = c(1,5)) +
labs(x = "Levels in Organization", y = "Exploitation Attributions") +
theme_classic() + guides(fill = FALSE)

Note: Error bars reflect confidence intervals.
Confidence intervals appear to overlap substantially.
Org Levels and Organizational Dehumanization
source("summarySE.R")
dat %>%
summarySE(., measurevar = "orgdehum", groupvars = "orglevels", na.rm = TRUE)
dat %>%
summarySE(., measurevar = "orgdehum", groupvars = "orglevels", na.rm = TRUE) %>%
ggplot(aes(x = orglevels, y = orgdehum, group = 1)) +
geom_errorbar(aes(ymin = orgdehum - ci, ymax = orgdehum + ci), width=.1) +
geom_line() + geom_point() +
scale_y_continuous(expand = c(0,0), limits = c(1,5)) +
labs(x = "Levels in Organization", y = "Exploitation Attributions") +
theme_classic() + guides(fill = FALSE)

Note: Error bars reflect confidence intervals.
Confidence intervals appear to overlap substantially.
Salary
Note: Add argument subset = (dat$salary != 1) to remove low N group.
cor.test(dat$salary, dat$exploitatt, method = "spearman")
Cannot compute exact p-value with ties
Spearman's rank correlation rho
data: dat$salary and dat$exploitatt
S = 1.2e+07, p-value = 0.01
alternative hypothesis: true rho is not equal to 0
sample estimates:
rho
-0.1235
cor.test(dat$salary, dat$exploitatt, method = "kendall")
Kendall's rank correlation tau
data: dat$salary and dat$exploitatt
z = -2.5, p-value = 0.01
alternative hypothesis: true tau is not equal to 0
sample estimates:
tau
-0.09148
Significant negative correlation between salary and exploitation attributions.
cor.test(dat$salary, dat$sblm, method = "spearman")
Cannot compute exact p-value with ties
Spearman's rank correlation rho
data: dat$salary and dat$sblm
S = 1.3e+07, p-value = 4e-05
alternative hypothesis: true rho is not equal to 0
sample estimates:
rho
-0.2049
cor.test(dat$salary, dat$sblm, method = "kendall")
Kendall's rank correlation tau
data: dat$salary and dat$sblm
z = -4.1, p-value = 4e-05
alternative hypothesis: true tau is not equal to 0
sample estimates:
tau
-0.1517
Significant negative correlation between salary and BLM.
cor.test(dat$salary, dat$orgdehum, method = "spearman")
Cannot compute exact p-value with ties
Spearman's rank correlation rho
data: dat$salary and dat$orgdehum
S = 1.3e+07, p-value = 3e-05
alternative hypothesis: true rho is not equal to 0
sample estimates:
rho
-0.2071
cor.test(dat$salary, dat$orgdehum, method = "kendall")
Kendall's rank correlation tau
data: dat$salary and dat$orgdehum
z = -4.1, p-value = 4e-05
alternative hypothesis: true tau is not equal to 0
sample estimates:
tau
-0.1486
Significant negative correlation between salary and organizational dehumanization.
cor.test(dat$salary, dat$wbatt, method = "spearman")
Cannot compute exact p-value with ties
Spearman's rank correlation rho
data: dat$salary and dat$wbatt
S = 9381537, p-value = 0.01
alternative hypothesis: true rho is not equal to 0
sample estimates:
rho
0.127
cor.test(dat$salary, dat$wbatt, method = "kendall")
Kendall's rank correlation tau
data: dat$salary and dat$wbatt
z = 2.5, p-value = 0.01
alternative hypothesis: true tau is not equal to 0
sample estimates:
tau
0.09412
Significant positive correlation between salary and well-being attributions.
Variable Preparation for Visualization
dat %<>%
mutate(salary = recode_factor(salary, `1` = "less than $10,000",
`2` = "$10,000 to $19,999",
`3` = "$20,000 to $29,999",
`4` = "$30,000 to $39,999",
`5` = "$40,000 to $49,999",
`6` = "$50,000 to $59,999",
`7` = "$60,000 to $69,999",
`8` = "$70,000 or more", .ordered = TRUE))
Salary and Exploitation Attributions
source("summarySE.R")
dat %>%
summarySE(., measurevar = "exploitatt", groupvars = "salary", na.rm = TRUE)
Perhaps omit individuals with salary < $10,000 due to low N-size?
source("summarySE.R")
dat %>%
summarySE(., measurevar = "exploitatt", groupvars = "salary", na.rm = TRUE) %>%
ggplot(aes(x = salary, y = exploitatt, group = 1)) +
geom_errorbar(aes(ymin = exploitatt - ci, ymax = exploitatt + ci), width=.1) +
geom_line() + geom_point() +
scale_y_continuous(expand = c(0,0), limits = c(0,7)) +
labs(x = "Salary", y = "Exploitation Attributions") +
theme_classic() + theme(axis.text.x = element_text(angle = 90, hjust = 1))

Note: Error bars reflect confidence intervals. CIs for lowest salary group does not fit within y-scale.
Salary and Supervisor’s Bottom-line Mentality
source("summarySE.R")
dat %>%
summarySE(., measurevar = "sblm", groupvars = "salary", na.rm = TRUE)
source("summarySE.R")
dat %>%
summarySE(., measurevar = "sblm", groupvars = "salary", na.rm = TRUE) %>%
ggplot(aes(x = salary, y = sblm, group = 1)) +
geom_errorbar(aes(ymin = sblm - ci, ymax = sblm + ci), width=.1) +
geom_line() + geom_point() +
scale_y_continuous(expand = c(0,0), limits = c(0,7)) +
labs(x = "Salary", y = "Supervisor's Bottom-line Mentality") +
theme_classic() + theme(axis.text.x = element_text(angle = 90, hjust = 1))

Salary and Organizational Dehumanization
source("summarySE.R")
dat %>%
summarySE(., measurevar = "orgdehum", groupvars = "salary", na.rm = TRUE)
source("summarySE.R")
dat %>%
summarySE(., measurevar = "orgdehum", groupvars = "salary", na.rm = TRUE) %>%
ggplot(aes(x = salary, y = orgdehum, group = 1)) +
geom_errorbar(aes(ymin = orgdehum - ci, ymax = orgdehum + ci), width=.1) +
geom_line() + geom_point() +
scale_y_continuous(expand = c(0,0), limits = c(0,7)) +
labs(x = "Salary", y = "Organizational Dehumanization") +
theme_classic() + theme(axis.text.x = element_text(angle = 90, hjust = 1))

Salary and Well-being Attributions
source("summarySE.R")
dat %>%
summarySE(., measurevar = "wbatt", groupvars = "salary", na.rm = TRUE)
source("summarySE.R")
dat %>%
summarySE(., measurevar = "wbatt", groupvars = "salary", na.rm = TRUE) %>%
ggplot(aes(x = salary, y = wbatt, group = 1)) +
geom_errorbar(aes(ymin = wbatt - ci, ymax = wbatt + ci), width=.1) +
geom_line() + geom_point() +
scale_y_continuous(expand = c(0,0), limits = c(0,7)) +
labs(x = "Salary", y = "Well-being Attributions") +
theme_classic() + theme(axis.text.x = element_text(angle = 90, hjust = 1))

Education
cor.test(dat$edu, dat$sblm, method = "spearman")
Cannot compute exact p-value with ties
Spearman's rank correlation rho
data: dat$edu and dat$sblm
S = 1.3e+07, p-value = 3e-04
alternative hypothesis: true rho is not equal to 0
sample estimates:
rho
-0.1811
cor.test(dat$edu, dat$sblm, method = "kendall")
Kendall's rank correlation tau
data: dat$edu and dat$sblm
z = -3.6, p-value = 3e-04
alternative hypothesis: true tau is not equal to 0
sample estimates:
tau
-0.14
Significant negative correlation between education and BLM.
cor.test(dat$edu, dat$orgdehum, method = "spearman")
Cannot compute exact p-value with ties
Spearman's rank correlation rho
data: dat$edu and dat$orgdehum
S = 1.2e+07, p-value = 0.01
alternative hypothesis: true rho is not equal to 0
sample estimates:
rho
-0.1239
cor.test(dat$edu, dat$orgdehum, method = "kendall")
Kendall's rank correlation tau
data: dat$edu and dat$orgdehum
z = -2.5, p-value = 0.01
alternative hypothesis: true tau is not equal to 0
sample estimates:
tau
-0.09336
Significant negative correlation between education and org dehumanization.
Variable Preparation for Visualization
dat %<>%
mutate(edu = recode_factor(edu, `1` = "high school, GED",
`2` = "associates",
`3` = "college",
`4` = "masters",
`5` = "doctoral", .ordered = TRUE))
Education and BLM
source("summarySE.R")
dat %>%
summarySE(., measurevar = "sblm", groupvars = "edu", na.rm = TRUE)
source("summarySE.R")
dat %>%
summarySE(., measurevar = "sblm", groupvars = "edu", na.rm = TRUE) %>%
ggplot(aes(x = edu, y = sblm, group = 1)) +
geom_errorbar(aes(ymin = sblm - ci, ymax = sblm + ci), width=.1) +
geom_line() + geom_point() +
scale_y_continuous(expand = c(0,0), limits = c(0,7)) +
labs(x = "Education", y = "Supervisor's Bottom-line Mentality") +
theme_classic() + theme(axis.text.x = element_text(angle = 90, hjust = 1))

Education and Org Dehumanization
source("summarySE.R")
dat %>%
summarySE(., measurevar = "orgdehum", groupvars = "edu", na.rm = TRUE)
source("summarySE.R")
dat %>%
summarySE(., measurevar = "orgdehum", groupvars = "edu", na.rm = TRUE) %>%
ggplot(aes(x = edu, y = orgdehum, group = 1)) +
geom_errorbar(aes(ymin = orgdehum - ci, ymax = orgdehum + ci), width=.1) +
geom_line() + geom_point() +
scale_y_continuous(expand = c(0,0), limits = c(0,7)) +
labs(x = "Education", y = "Organizational Dehumanization") +
theme_classic() + theme(axis.text.x = element_text(angle = 90, hjust = 1))

Notably, education is positively related to salary and responsibility for direct reports.
Responsible for Direct Reports
Responsibility for direct reports correlated with well-being attributions and org dehumanization.
Variable Preparation
dat %<>%
mutate(dirreport = recode_factor(dirreport, `1` = "Yes",
`0` = "No"))
Responsibility and Well-being Attributions
source("summarySE.R")
dat%>%
summarySE(., measurevar = "wbatt", groupvars = "dirreport", na.rm = TRUE)
t.test(dat$wbatt ~ dat$dirreport, var.equal = TRUE)
Two Sample t-test
data: dat$wbatt by dat$dirreport
t = 2.3, df = 399, p-value = 0.02
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
0.06015 0.73940
sample estimates:
mean in group Yes mean in group No
4.688 4.288
source("summarySE.R")
dat %>%
summarySE(., measurevar = "wbatt", groupvars = "dirreport", na.rm = TRUE) %>%
ggplot(aes(x = dirreport, y = wbatt, group = dirreport, fill = dirreport)) +
geom_bar(stat = "identity", width = 0.3) +
scale_fill_grey(start = .4, end = .8) +
geom_errorbar(aes(ymin = wbatt - ci, ymax = wbatt + ci), size = 0.5, width = 0.07) +
scale_y_continuous(expand = c(0,0), limits = c(0,7), breaks = c(1:7)) +
labs(x = "Responsibility for Direct Reports", y = "Employee-Centric HR Attributions") +
theme(text = element_text(size = 13)) + guides(fill = FALSE)

Note: Error bars represent confidence intervals.
Although t-test is significant, confidence intervals overlap.
Responsibility and Org Dehumanization
source("summarySE.R")
dat %>%
summarySE(., measurevar = "orgdehum", groupvars = "dirreport", na.rm = TRUE)
t.test(dat$orgdehum ~ dat$dirreport, var.equal = TRUE)
Two Sample t-test
data: dat$orgdehum by dat$dirreport
t = -2.1, df = 398, p-value = 0.03
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-0.61507 -0.02656
sample estimates:
mean in group Yes mean in group No
3.587 3.907
source("summarySE.R")
dat %>%
summarySE(., measurevar = "orgdehum", groupvars = "dirreport", na.rm = TRUE) %>%
ggplot(aes(x = dirreport, y = orgdehum, group = dirreport, fill = dirreport)) +
geom_bar(stat = "identity", width = 0.3) +
scale_fill_grey(start = .4, end = .8) +
geom_errorbar(aes(ymin = orgdehum - ci, ymax = orgdehum + ci), size = 0.5, width = 0.07) +
scale_y_continuous(expand = c(0,0), limits = c(0,7), breaks = c(1:7)) +
labs(x = "Responsibility for Direct Reports", y = "Organizational Dehumanization") +
theme(text = element_text(size = 13)) + guides(fill = FALSE)

Note: Error bars represent confidence intervals.
Although t-test is significant, confidence intervals overlap.
LS0tCnRpdGxlOiAiRGlzc2VydGF0aW9uIEFuYWx5c2lzIENvbXBpbGVkIgphdXRob3I6ICJTdGV2ZW4gVC4gVHNlbmciCmRhdGU6ICdgciBwYXN0ZSgiRmlyc3QgY3JlYXRlZCBvbiBEZWMgMjQsIDIwMTkuIFVwZGF0ZWQgb24iLCBTeXMuRGF0ZSgpKWAnCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRoZW1lOiBjZXJ1bGVhbgogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShwc3ljaCkKbGlicmFyeShsYXR0aWNlKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkobGF2YWFuKQpsaWJyYXJ5KG1hZ3JpdHRyKQpsaWJyYXJ5KGJyb29tKQoKb3B0aW9ucyhkaWdpdHMgPSAzKQp0aGVtZV9zZXQodGhlbWVfY2xhc3NpYygpKQoKZGF0IDwtIHJlYWRfeGxzeCgiLi9EaXNzZXJ0YXRpb24gRGF0YS9kaXNzZXJ0YXRpb25kYXRhQ09NUExFVEUueGxzeCIpCmBgYAoKCioqKioKCiMgU2NhbGUgUmVsaWFiaWxpdGllcwoKIyMgT3JnIERlaHVtYW5pemF0aW9uCgpgYGB7cn0KZGF0ICU+JQogIHNlbGVjdChvcmdkZWh1bV8xOm9yZ2RlaHVtXzExKSAlPiUKICBhcy5kYXRhLmZyYW1lKC4pICU+JQogIHBzeWNoOjphbHBoYSguKQpgYGAKKioqQWxwaGEgaW1wcm92ZXMgdG8gLjk2IGlmIEl0ZW0gMSBpcyBkcm9wcGVkCgojIyBIUiBBdHRyaWJ1dGlvbnMKCmBgYHtyfQpkYXQgJT4lCiAgc2VsZWN0KGV4cGxvaXRfMTp3YmF0dF8zKSAlPiUKICBwc3ljaDo6YWxwaGEoLikKYGBgCgpIb3JyaWJsZSBhbHBoYSwgYXMgZXhwZWN0ZWQuIFNjYWxlIGNvbnNpc3RzIG9mIHR3byBjb25jZXB0dWFsbHkgZGlzdGluY3QgZmFjdG9ycy4KCiMjIEV4cGxvaXRhdGlvbiBBdHRyaWJ1dGlvbnMKYGBge3J9CmRhdCAlPiUKICBzZWxlY3QoZXhwbG9pdF8xOmV4cGxvaXRfMykgJT4lCiAgcHN5Y2g6OmFscGhhKC4pCmBgYAoKIyMgQ29zdC1zYXZpbmcgQXR0cmlidXRpb25zCmBgYHtyfQpkYXQgJT4lCiAgc2VsZWN0KGNvc3RfMTpjb3N0XzMpICU+JQogIHBzeWNoOjphbHBoYSguKQpgYGAKCiMjIFBlcmZvcm1hbmNlIEF0dHJpYnV0aW9ucwpgYGB7cn0KZGF0ICU+JQogIHNlbGVjdChwZXJmYXR0XzE6cGVyZmF0dF8zKSAlPiUKICBwc3ljaDo6YWxwaGEoLikKYGBgCkFscGhhIGltcHJvdmVzIHRvIC45MyBpZiBJdGVtIDMgZHJvcHBlZAoKIyMgV2VsbC1iZWluZyBBdHRyaWJ1dGlvbnMKYGBge3J9CmRhdCAlPiUKICBzZWxlY3Qod2JhdHRfMTp3YmF0dF8zKSAlPiUKICBwc3ljaDo6YWxwaGEoLikKYGBgCgojIyBCTE0KYGBge3J9CmRhdCAlPiUKICBzZWxlY3Qoc2JsbV8xOnNibG1fNCkgJT4lCiAgcHN5Y2g6OmFscGhhKC4pCmBgYAoKIyMgU09FCmBgYHtyfQpkYXQgJT4lCiAgc2VsZWN0KHNvZV8xOnNvZV85KSAlPiUKICBwc3ljaDo6YWxwaGEoLikKYGBgCgojIyBKb2IgU2F0aXNmYWN0aW9uCmBgYHtyfQpkYXQgJT4lCiAgc2VsZWN0KGpvYnNhdF8xOmpvYnNhdF8zKSAlPiUKICBwc3ljaDo6YWxwaGEoLikKYGBgCgojIyBBZmZlY3RpdmUgQ29tbWl0bWVudApgYGB7cn0KZGF0ICU+JQogIHNlbGVjdChhY29tbWl0XzE6YWNvbW1pdF82KSAlPiUKICBwc3ljaDo6YWxwaGEoLikKYGBgCgojIyBUdXJub3ZlciBJbnRlbnRpb25zCmBgYHtyfQpkYXQgJT4lCiAgc2VsZWN0KHRvaW50ZW50XzE6dG9pbnRlbnRfMikgJT4lCiAgcHN5Y2g6OmFscGhhKC4pCmBgYAoKIyMgQnVybm91dApgYGB7cn0KZGF0ICU+JQogIHNlbGVjdChkaXNlbmdfMXI6ZXhoYXVzdF84cikgJT4lCiAgcHN5Y2g6OmFscGhhKC4pCmBgYAoKIyMgQnVybm91dDogRGlzZW5nYWdlbWVudApgYGB7cn0KZGF0ICU+JQogIHNlbGVjdChkaXNlbmdfMXIsIGRpc2VuZ18yLCBkaXNlbmdfMywgZGlzZW5nXzRyLCBkaXNlbmdfNSwgZGlzZW5nXzYsIGRpc2VuZ183ciwgZGlzZW5nXzhyKSAlPiUKICBwc3ljaDo6YWxwaGEoLikKYGBgCgojIyBCdXJub3V0OiBFeGhhdXN0aW9uCmBgYHtyfQpkYXQgJT4lCiAgc2VsZWN0KGV4aGF1c3RfMSwgZXhoYXVzdF8yLCBleGhhdXN0XzNyLCBleGhhdXN0XzQsIGV4aGF1c3RfNXIsIGV4aGF1c3RfNiwgZXhoYXVzdF83ciwgZXhoYXVzdF84cikgJT4lCiAgcHN5Y2g6OmFscGhhKC4pCmBgYAoqKioqQWxwaGEgaW1wcm92ZXMgdG8gLjg4IGlmIEl0ZW0gN3IgZHJvcHBlZAoKIyMgVGFzayBQZXJmb3JtYW5jZQpgYGB7cn0KZGF0ICU+JQogIHNlbGVjdChwZXJmXzE6cGVyZl81KSAlPiUKICBwc3ljaDo6YWxwaGEoLikKYGBgCioqKipBbHBoYSBpbXByb3ZlcyB0byAuODk3IGlmIEl0ZW0gNSBkcm9wcGVkIAoKIyMgT0NCcwpgYGB7cn0KZGF0ICU+JQogIHNlbGVjdChvY2JfMTpvY2JfMTApICU+JQogIHBzeWNoOjphbHBoYSguKQpgYGAKCiMjIENXQnMKYGBge3J9CmRhdCAlPiUKICBzZWxlY3QoY3diXzE6Y3diXzEwKSAlPiUKICBwc3ljaDo6YWxwaGEoLikKYGBgCgojIyBQT1MKYGBge3J9CmRhdCAlPiUKICBzZWxlY3QocG9zXzE6cG9zXzgpICU+JQogIHBzeWNoOjphbHBoYSguKQpgYGAKCioqKioKCiMgRmFjdG9yIFN0cnVjdHVyZXMKCiMjIEV4YW1pbmUgSFIgQXR0cmlidXRpb25zIEZhY3RvciBTdHJ1Y3R1cmUKYGBge3J9CmhyYXR0Lm1vZGVsIDwtICdleHBsb2l0ID1+IGV4cGxvaXRfMSArIGV4cGxvaXRfMiArIGV4cGxvaXRfMwogICAgICAgICAgICAgICAgY29zdCA9fiBjb3N0XzEgKyBjb3N0XzIgKyBjb3N0XzMKICAgICAgICAgICAgICAgIHBlcmZvcm0gPX4gcGVyZmF0dF8xICsgcGVyZmF0dF8yICsgcGVyZmF0dF8zCiAgICAgICAgICAgICAgICB3YiA9fiB3YmF0dF8xICsgd2JhdHRfMiArIHdiYXR0XzMnCgpocmF0dC5maXQgPC0gY2ZhKGhyYXR0Lm1vZGVsLCBkYXRhID0gZGF0KQpzdW1tYXJ5KGhyYXR0LmZpdCwgZml0Lm1lYXN1cmVzID0gVFJVRSkKYGBgCioqKipBY2NlcHRhYmxlIGZpdCBtZWFzdXJlcwoKIyMgRXhhbWluZSBCdXJub3V0IEZhY3RvciBTdHJ1Y3R1cmUKYGBge3J9CmJ1cm5vdXQubW9kZWwgPC0gJ2Rpc2VuZ2FnZSA9fiBkaXNlbmdfMXIgKyBkaXNlbmdfMiArIGRpc2VuZ18zICsgZGlzZW5nXzRyICsgZGlzZW5nXzUgKyBkaXNlbmdfNiArIGRpc2VuZ183ciArIGRpc2VuZ184cgpleGhhdXN0aW9uID1+IGV4aGF1c3RfMSArIGV4aGF1c3RfMiArIGV4aGF1c3RfM3IgKyBleGhhdXN0XzQgKyBleGhhdXN0XzVyICsgZXhoYXVzdF82ICsgZXhoYXVzdF83ciArIGV4aGF1c3RfOHInCgpidXJub3V0LmZpdCA8LSBjZmEoYnVybm91dC5tb2RlbCwgZGF0YSA9IGRhdCkKc3VtbWFyeShidXJub3V0LmZpdCwgZml0Lm1lYXN1cmVzID0gVFJVRSkKYGBgCioqKipOb3QgdmVyeSBnb29kIGZpdAoKKioqKgoKIyBEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzCioqKioKIyMgRGVtb2dyYXBoaWNzCioqKioKIyMjIE9yZ2FuaXphdGlvbiBUeXBlCmBgYHtyfQpkYXQgJT4lCiAgbXV0YXRlKG9yZ3R5cGUgPSByZWNvZGUob3JndHlwZSwgYDBgID0gIm5vbnByb2ZpdCIsIGAxYCA9ICJmb3ItcHJvZml0IikpICU+JQogIHNlbGVjdChvcmd0eXBlKSAlPiUKICBncm91cF9ieShvcmd0eXBlKSAlPiUKICB0YWxseSgpCmBgYAoKIyMjIE9yZ2FuaXphdGlvbiBTaXplCmBgYHtyfQpkYXQgJT4lCiAgbXV0YXRlKG9yZ3NpemUgPSByZWNvZGVfZmFjdG9yKG9yZ3NpemUsIGAxYCA9ICJsZXNzIHRoYW4gMTAiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGAyYCA9ICIxMCB0byA0OSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYDNgID0gIjUwIHRvIDk5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICBgNGAgPSAiMTAwIHRvIDQ5OSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYDVgID0gIjUwMCB0byA5OTkiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGA2YCA9ICIxMDAwIG9yIG1vcmUiKSwgLm9yZGVyZWQgPSBUUlVFKSAlPiUKICBzZWxlY3Qob3Jnc2l6ZSkgJT4lCiAgZ3JvdXBfYnkob3Jnc2l6ZSkgJT4lCiAgdGFsbHkoKQoKZGF0ICU+JQogIG11dGF0ZShvcmdzaXplID0gcmVjb2RlX2ZhY3RvcihvcmdzaXplLCBgMWAgPSAibGVzcyB0aGFuIDEwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBgMmAgPSAiMTAgdG8gNDkiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGAzYCA9ICI1MCB0byA5OSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYDRgID0gIjEwMCB0byA0OTkiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGA1YCA9ICI1MDAgdG8gOTk5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICBgNmAgPSAiMTAwMCBvciBtb3JlIiksIC5vcmRlcmVkID0gVFJVRSkgJT4lCiAgc2VsZWN0KG9yZ3NpemUpICU+JQogIGJhcmNoYXJ0KC4pCmBgYAoKIyMjIE9yZ2FuaXphdGlvbiBMZXZlbHMKYGBge3J9CmRhdCAlPiUKICBtdXRhdGUob3JnbGV2ZWxzID0gcmVjb2RlX2ZhY3RvcihvcmdsZXZlbHMsIGAxYCA9ICJ0aHJlZSBvciBmZXdlciBsZXZlbHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAyYCA9ICJmb3VyIGxldmVscyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDNgID0gImZpdmUgbGV2ZWxzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNGAgPSAic2l4IGxldmVscyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDVgID0gInNldmVuIGxldmVscyBvciBtb3JlIiwgLm9yZGVyZWQgPSBUUlVFKSkgJT4lCiAgc2VsZWN0KG9yZ2xldmVscykgJT4lCiAgZ3JvdXBfYnkob3JnbGV2ZWxzKSAlPiUKICB0YWxseSgpCgpkYXQgJT4lCiAgbXV0YXRlKG9yZ2xldmVscyA9IHJlY29kZV9mYWN0b3Iob3JnbGV2ZWxzLCBgMWAgPSAidGhyZWUgb3IgZmV3ZXIgbGV2ZWxzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMmAgPSAiZm91ciBsZXZlbHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAzYCA9ICJmaXZlIGxldmVscyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDRgID0gInNpeCBsZXZlbHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA1YCA9ICJzZXZlbiBsZXZlbHMgb3IgbW9yZSIsIC5vcmRlcmVkID0gVFJVRSkpICU+JQogIHNlbGVjdChvcmdsZXZlbHMpICU+JQogIGJhcmNoYXJ0KC4pCmBgYAoKIyMjIE9yZ2FuaXphdGlvbiBDZW50cmFsaXR5CmBgYHtyfQpkYXQgJT4lCiAgbXV0YXRlKG9yZ2NlbnQgPSByZWNvZGVfZmFjdG9yKG9yZ2NlbnQsIGAxYCA9ICJDRU8sIHByZXNpZGVudCwgb3IgbWFuYWdpbmcgZGlyZWN0b3IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMmAgPSAiY29ycG9yYXRlIG1hbmFnZW1lbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgM2AgPSAiYnJhbmNoIG1hbmFnZW1lbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNGAgPSAiaW5wdXQgZnJvbSBmcm9udGxpbmUgZW1wbG95ZWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDVgID0gIm90aGVyIiksIC5vcmRlcmVkID0gVFJVRSkgJT4lCiAgc2VsZWN0KG9yZ2NlbnQpICU+JQogIGdyb3VwX2J5KG9yZ2NlbnQpICU+JQogIHRhbGx5KCkKCmRhdCAlPiUKICBtdXRhdGUob3JnY2VudCA9IHJlY29kZV9mYWN0b3Iob3JnY2VudCwgYDFgID0gIkNFTywgcHJlc2lkZW50LCBvciBtYW5hZ2luZyBkaXJlY3RvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAyYCA9ICJjb3Jwb3JhdGUgbWFuYWdlbWVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAzYCA9ICJicmFuY2ggbWFuYWdlbWVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA0YCA9ICJpbnB1dCBmcm9tIGZyb250bGluZSBlbXBsb3llZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNWAgPSAib3RoZXIiKSwgLm9yZGVyZWQgPSBUUlVFKSAlPiUKICBzZWxlY3Qob3JnY2VudCkgJT4lCiAgYmFyY2hhcnQoLikKYGBgCgojIyMgUmVnaW9uCmBgYHtyfQpkYXQgJT4lCiAgc2VsZWN0KHJlZ2lvbikgJT4lCiAgZ3JvdXBfYnkocmVnaW9uKSAlPiUKICB0YWxseSgpCgpkYXQgJT4lCiAgc2VsZWN0KHJlZ2lvbikgJT4lCiAgYmFyY2hhcnQoLikKYGBgCgojIyMgSW5kdXN0cnkKYGBge3J9CmRhdCAlPiUKICBzZWxlY3QoaW5kdXN0cnkpICU+JQogIGdyb3VwX2J5KGluZHVzdHJ5KSAlPiUKICB0YWxseSgpCgpkYXQgJT4lCiAgc2VsZWN0KGluZHVzdHJ5KSAlPiUKICBiYXJjaGFydCguKQpgYGAKCiMjIyBFbXBsb3ltZW50IFN0YXR1cwpgYGB7cn0KZGF0ICU+JQogIG11dGF0ZShzdGF0dXMgPSByZWNvZGUoc3RhdHVzLCBgMGAgPSAiZnVsbC10aW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGAxYCA9ICJwYXJ0LXRpbWUiKSkgJT4lICMgcmVjb2RlIGZ1bGwtdGltZSA9IDAsIHBhcnQtdGltZSA9IDEKICBzZWxlY3Qoc3RhdHVzKSAlPiUKICBncm91cF9ieShzdGF0dXMpICU+JQogIHRhbGx5KCkKYGBgCgoKIyMjIFJlc3BvbnNpYmxlIGZvciBEaXJlY3QgUmVwb3J0cwpgYGB7cn0KZGF0ICU+JQogIG11dGF0ZShkaXJyZXBvcnQgPSByZWNvZGUoZGlycmVwb3J0LCBgMWAgPSAieWVzIiwgYDBgID0gIm5vIikpICU+JQogIHNlbGVjdChkaXJyZXBvcnQpICU+JQogIGdyb3VwX2J5KGRpcnJlcG9ydCkgJT4lCiAgdGFsbHkoKQoKZGF0ICU+JQogIG11dGF0ZShkaXJyZXBvcnQgPSByZWNvZGUoZGlycmVwb3J0LCBgMWAgPSAieWVzIiwgYDBgID0gIm5vIikpICU+JQogIHNlbGVjdChkaXJyZXBvcnQpICU+JQogIGJhcmNoYXJ0KC4pCmBgYAoKIyMjIFNhbGFyeQpgYGB7cn0KZGF0ICU+JQogIG11dGF0ZShzYWxhcnkgPSByZWNvZGVfZmFjdG9yKHNhbGFyeSwgYDFgID0gImxlc3MgdGhhbiAkMTAsMDAwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMmAgPSAiJDEwLDAwMCB0byAkMTksOTk5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgM2AgPSAiJDIwLDAwMCB0byAkMjksOTk5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNGAgPSAiJDMwLDAwMCB0byAkMzksOTk5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNWAgPSAiJDQwLDAwMCB0byAkNDksOTk5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNmAgPSAiJDUwLDAwMCB0byAkNTksOTk5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgN2AgPSAiJDYwLDAwMCB0byAkNjksOTk5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgOGAgPSAiJDcwLDAwMCBvciBtb3JlIiwgLm9yZGVyZWQgPSBUUlVFKSkgJT4lCiAgc2VsZWN0KHNhbGFyeSkgJT4lCiAgZ3JvdXBfYnkoc2FsYXJ5KSAlPiUKICB0YWxseSgpCgpkYXQgJT4lCiAgbXV0YXRlKHNhbGFyeSA9IHJlY29kZV9mYWN0b3Ioc2FsYXJ5LCBgMWAgPSAibGVzcyB0aGFuICQxMCwwMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAyYCA9ICIkMTAsMDAwIHRvICQxOSw5OTkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAzYCA9ICIkMjAsMDAwIHRvICQyOSw5OTkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA0YCA9ICIkMzAsMDAwIHRvICQzOSw5OTkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA1YCA9ICIkNDAsMDAwIHRvICQ0OSw5OTkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA2YCA9ICIkNTAsMDAwIHRvICQ1OSw5OTkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA3YCA9ICIkNjAsMDAwIHRvICQ2OSw5OTkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA4YCA9ICIkNzAsMDAwIG9yIG1vcmUiLCAub3JkZXJlZCA9IFRSVUUpKSAlPiUKICBzZWxlY3Qoc2FsYXJ5KSAlPiUKICBiYXJjaGFydCguKQpgYGAKCiMjIyBXZWVrbHkgSG91cnMKYGBge3J9CmRhdCAlPiUKICBkcGx5cjo6c2VsZWN0KHdlZWtob3VycykKZGF0ICU+JQogIGRwbHlyOjpzZWxlY3Qod2Vla2hvdXJzKSAlPiUKICBmaWx0ZXIod2Vla2hvdXJzIDwgMjUpCmRhdCAlPiUKICBkcGx5cjo6c2VsZWN0KHdlZWtob3VycykgJT4lCiAgZmlsdGVyKHdlZWtob3VycyA+PSA0MCkKaGlzdG9ncmFtKGRhdCR3ZWVraG91cnMsIHR5cGUgPSAiY291bnQiLCBicmVha3MgPSBjKDcuNTo3Mi41KSkKYGBgCgoKIyMjIEdlbmRlcgpgYGB7cn0KZGF0ICU+JQogIG11dGF0ZShnZW5kZXIgPSByZWNvZGUoZ2VuZGVyLCBgMGAgPSAibWFsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDFgID0gImZlbWFsZSIpKSAlPiUKICBzZWxlY3QoZ2VuZGVyKSAlPiUKICBncm91cF9ieShnZW5kZXIpICU+JQogIHRhbGx5KCkKCmRhdCAlPiUKICBtdXRhdGUoZ2VuZGVyID0gcmVjb2RlX2ZhY3RvcihnZW5kZXIsIGAwYCA9ICJtYWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAxYCA9ICJmZW1hbGUiKSkgJT4lCiAgc2VsZWN0KGdlbmRlcikgJT4lCiAgYmFyY2hhcnQoLikKYGBgCgojIyMgQWdlCmBgYHtyfQpkYXQgJT4lCiAgbXV0YXRlKGFnZSA9IHJlY29kZV9mYWN0b3IoYWdlLCBgMWAgPSAiMTgtMjQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAyYCA9ICIyNS0zMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDNgID0gIjMxLTQwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNGAgPSAiNDEtNTAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA1YCA9ICI1MS02MCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDZgID0gIm92ZXIgNjAiKSkgJT4lCiAgc2VsZWN0KGFnZSkgJT4lCiAgZ3JvdXBfYnkoYWdlKSAlPiUKICB0YWxseSgpCgpkYXQgJT4lCiAgbXV0YXRlKGFnZSA9IHJlY29kZV9mYWN0b3IoYWdlLCBgMWAgPSAiMTgtMjQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAyYCA9ICIyNS0zMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDNgID0gIjMxLTQwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNGAgPSAiNDEtNTAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA1YCA9ICI1MS02MCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDZgID0gIm92ZXIgNjAiKSkgJT4lCiAgc2VsZWN0KGFnZSkgJT4lCiAgYmFyY2hhcnQoLikKYGBgCgojIyMgUmFjZQpgYGB7cn0KZGF0ICU+JQogIHNlbGVjdChyYWNlKSAlPiUKICBncm91cF9ieShyYWNlKSAlPiUKICB0YWxseSgpCgpkYXQgJT4lCiAgc2VsZWN0KHJhY2UpICU+JQogIGJhcmNoYXJ0KC4pCmBgYAoKIyMjIEVuZ2xpc2ggRmlyc3QgTGFuZ3VhZ2UKYGBge3J9CmRhdCAlPiUKICBtdXRhdGUoZW5nbGlzaCA9IHJlY29kZShlbmdsaXNoLCBgMWAgPSAiZW5nbGlzaCBmaXJzdCBsYW5ndWFnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAwYCA9ICJlbmdsaXNoIG5vdCBmaXJzdCBsYW5ndWFnZSIpKSAlPiUKICBzZWxlY3QoZW5nbGlzaCkgJT4lCiAgZ3JvdXBfYnkoZW5nbGlzaCkgJT4lCiAgdGFsbHkoKQpgYGAKCiMjIyBNYXJpdGFsIFN0YXR1cwpgYGB7cn0KZGF0ICU+JQogIHNlbGVjdChtYXJpdGFsKSAlPiUKICBncm91cF9ieShtYXJpdGFsKSAlPiUKICB0YWxseSgpCgpkYXQgJT4lCiAgc2VsZWN0KG1hcml0YWwpICU+JQogIGJhcmNoYXJ0KC4pCmBgYAoKIyMjIEVkdWNhdGlvbgpgYGB7cn0KZGF0ICU+JQogIG11dGF0ZShlZHUgPSByZWNvZGVfZmFjdG9yKGVkdSwgYDFgID0gImhpZ2ggc2Nob29sLCBHRUQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAyYCA9ICJhc3NvY2lhdGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgM2AgPSAiY29sbGVnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDRgID0gIm1hc3RlcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA1YCA9ICJkb2N0b3JhbCIsIC5vcmRlcmVkID0gVFJVRSkpICU+JQogIHNlbGVjdChlZHUpICU+JQogIGdyb3VwX2J5KGVkdSkgJT4lCiAgdGFsbHkoKQoKZGF0ICU+JQogICAgbXV0YXRlKGVkdSA9IHJlY29kZV9mYWN0b3IoZWR1LCBgMWAgPSAiaGlnaCBzY2hvb2wsIEdFRCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDJgID0gImFzc29jaWF0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAzYCA9ICJjb2xsZWdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNGAgPSAibWFzdGVycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDVgID0gImRvY3RvcmFsIiwgLm9yZGVyZWQgPSBUUlVFKSkgJT4lCiAgc2VsZWN0KGVkdSkgJT4lCiAgYmFyY2hhcnQoLikKICAKYGBgCgoqKioqCgojIyBDb25zdHJ1Y3RzIG9mIEludGVyZXN0IAoqKioqCgojIyMgSFIgQXR0cmlidXRpb25zCmBgYHtyfQpkYXQgJT4lCiAgc2VsZWN0KGV4cGxvaXRhdHQ6d2JhdHQpICU+JQogIHBzeWNoOjpkZXNjcmliZSguKQpgYGAKCiMjIyBCTE0sIFNPRSwgT3JnIERlaHVtYW5pemF0aW9uIGFuZCBQT1MKYGBge3J9CmRhdCAlPiUKICBzZWxlY3Qoc2JsbTpwb3MpICU+JQogIHBzeWNoOjpkZXNjcmliZSguKQpgYGAKCiMjIyBPdXRjb21lIFZhcmlhYmxlcwpgYGB7cn0KZGF0ICU+JQogIHNlbGVjdChqb2JzYXQ6Y3diKSAlPiUKICBwc3ljaDo6ZGVzY3JpYmUoLikKYGBgCgoqKioqCgpOb3Rld29ydGh5IG9ic2VydmF0aW9uczoKCiogRXhwbG9pdGF0aW9uIGF0dHJpYnV0aW9ucywgQkxNLCBhbmQgb3JnIGRlaHVtYW5pemF0aW9uIHBlcmNlcHRpb25zIGJlbG93IHNjYWxlIG1pZHBvaW50CgoqIFNhbXBsZSBhcHBlYXJzIHRvIGluY2x1ZGUgbW9zdGx5IGluZGl2aWR1YWxzIHdpdGggcG9zaXRpdmUgam9iIGF0dGl0dWRlcyBhbmQgbG93IG9uIG5lZ2F0aXZlIHByZWRpY3RvcnMKCioqKioKCiMgIEJhciBHcmFwaHMgYW5kIEhpc3RvZ3JhbXMKCiMjIEV4cGxvaXRhdGlvbiBBdHRyaWJ1dGlvbnMKYGBge3J9Cmhpc3RvZ3JhbShkYXQkZXhwbG9pdGF0dCwgdHlwZSA9ICJjb3VudCIsIGJyZWFrcyA9IGMoMC41OjcuNSkpCmBgYAoKYGBge3J9CnFxbm9ybShkYXQkZXhwbG9pdGF0dCkKcXFsaW5lKGRhdCRleHBsb2l0YXR0KQpgYGAKCmBgYHtyfQpzaGFwaXJvLnRlc3QoZGF0JGV4cGxvaXRhdHQpCmBgYAoKRGF0YSBhcHBlYXIgdG8gYmUgcG9zaXRpdmVseSBza2V3ZWQuCgojIyBXZWxsLWJlaW5nIEF0dHJpYnV0aW9ucwpgYGB7cn0KaGlzdG9ncmFtKGRhdCR3YmF0dCwgdHlwZSA9ICJjb3VudCIsIGJyZWFrcyA9IGMoMC41OjcuNSkpCmBgYAoKYGBge3J9CnFxbm9ybShkYXQkd2JhdHQpCnFxbGluZShkYXQkd2JhdHQpCmBgYAoKYGBge3J9CnNoYXBpcm8udGVzdChkYXQkd2JhdHQpCmBgYAoKTmVnYXRpdmVseSBza2V3ZWQuCgojIyBCTE0KYGBge3J9Cmhpc3RvZ3JhbShkYXQkc2JsbSwgdHlwZSA9ICJjb3VudCIsIGJyZWFrcyA9IGMoMC41OjcuNSkpCmBgYAoKYGBge3J9CnFxbm9ybShkYXQkc2JsbSkKcXFsaW5lKGRhdCRzYmxtKQpgYGAKCmBgYHtyfQpzaGFwaXJvLnRlc3QoZGF0JHNibG0pCmBgYAoKUG9zaXRpdmVseSBza2V3ZWQuCgojIyBTT0UKYGBge3J9Cmhpc3RvZ3JhbShkYXQkc29lLCB0eXBlID0gImNvdW50IiwgYnJlYWtzID0gYygwLjU6Ny41KSkKYGBgCgpgYGB7cn0KcXFub3JtKGRhdCRzb2UpCnFxbGluZShkYXQkc29lKQpgYGAKCmBgYHtyfQpzaGFwaXJvLnRlc3QoZGF0JHNvZSkKYGBgCgpOZWdhdGl2ZSBza2V3LgoKIyMgT3JnIERlaHVtYW5pemF0aW9uCmBgYHtyfQpoaXN0b2dyYW0oZGF0JG9yZ2RlaHVtLCB0eXBlID0gImNvdW50IiwgYnJlYWtzID0gYygwLjU6Ny41KSkKYGBgCgpgYGB7cn0KcXFub3JtKGRhdCRvcmdkZWh1bSkKcXFsaW5lKGRhdCRvcmdkZWh1bSkKYGBgCgpgYGB7cn0Kc2hhcGlyby50ZXN0KGRhdCRvcmdkZWh1bSkKYGBgCgpQb3NpdGl2ZSBza2V3LgoKKioqKiBOb3RlOiBWYXJpYWJsZXMgb2YgaW50ZXJlc3QgYXBwZWFyIHRvIGJlIG5vbi1ub3JtYWwsIHdoaWNoIHZpb2xhdGVzIHRoZSBhc3N1bXB0aW9ucyBmb3IgYSBzaWduaWZpY2FuY2UgdGVzdCBmb3IgY29ycmVsYXRpb25zIGludm9sdmluZyB0aGUgdmFyaWFibGVzLgoKKioqKgoKIyBTY2F0dGVycGxvdCBNYXRyaXgKCiMjIEFudGVjZWRlbnRzIGFuZCBPcmcgRGVodW1hbml6YXRpb24KYGBge3J9CmxpYnJhcnkoY2FyKQpkYXQgJT4lCiAgc2VsZWN0KGV4cGxvaXRhdHQsIHdiYXR0LCBzYmxtLCBzb2UsIG9yZ2RlaHVtKSAlPiUKICBzY2F0dGVycGxvdE1hdHJpeCguKQpgYGAKCiMjIE9yZyBEZWh1bWFuaXphdGlvbiBhbmQgQXR0aXR1ZGVzCmBgYHtyfQpkYXQgJT4lCiAgc2VsZWN0KG9yZ2RlaHVtLCBqb2JzYXQsIGFjb21taXQsIHRvaW50ZW50KSAlPiUKICBzY2F0dGVycGxvdE1hdHJpeCguKQpgYGAKCiMjIE9yZyBEZWh1bWFuaXphdGlvbiBhbmQgQnVybm91dApgYGB7cn0KZGF0ICU+JQogIHNlbGVjdChvcmdkZWh1bSwgZGlzZW5nLCBleGhhdXN0LCBidXJub3V0KSAlPiUKICBzY2F0dGVycGxvdE1hdHJpeCguKQpgYGAKCiMjIE9yZyBEZWh1bWFuaXphdGlvbiBhbmQgUGVyZm9ybWFuY2UKYGBge3J9CmRhdCAlPiUKICBzZWxlY3Qob3JnZGVodW0sIHBlcmYsIG9jYiwgY3diKSAlPiUKICBzY2F0dGVycGxvdE1hdHJpeCguKQpgYGAKCioqKioKCiMgUHJpbWFyeSBBbmFseXNlcwoKKioqKgoKTG9hZCBhZGRpdGlvbmFsIGxpYnJhcmllcyBhbmQgc2V0IGRlZmF1bHQgcm91bmRpbmcgdmFsdWUgYW5kIGdyYXBoIHRoZW1lLgoKYGBge3IsIG1lc3NhZ2UgPSBGQUxTRX0KbGlicmFyeShlZmZlY3RzKQpsaWJyYXJ5KGxhdHRpY2UpCmxpYnJhcnkoSG1pc2MpCmxpYnJhcnkoeHRhYmxlKQoKb3B0aW9ucyhkaWdpdHMgPSA0KQoKdGhlbWVfc2V0KHRoZW1lX2NsYXNzaWMoKSkKYGBgCgoqKioqCgojIyBNZWFucyBhbmQgU3RhbmRhcmQgRGV2aWF0aW9ucwpgYGB7cn0KZGF0ICU+JQogIHNlbGVjdChvcmdkZWh1bSwgZXhwbG9pdGF0dCwgd2JhdHQsIHNibG0sIHNvZSwgam9ic2F0LCBhY29tbWl0LCBidXJub3V0LCB0b2ludGVudCwgcGVyZiwgb2NiLCBjd2IsIHNlbGVjdGlvbiwgdHJhaW5pbmcsIGFwcHJhaXNhbCwgY29tcGVuc2F0aW9uLCBocnByYWN0aWNlcywgb3JndHlwZSwgb3Jnc2l6ZSwgb3JnbGV2ZWxzLCBvcmdjZW50LCBnZW5kZXIsIGFnZSwgcmFjZW51bSwgZW5nbGlzaCwgZWR1LCBzdGF0dXMsIG9yZ3RlbnVyZSwgcG9zdGVudXJlLCBzdXB0ZW51cmUsIGRpcnJlcG9ydCwgd2Vla2hvdXJzLCBzYWxhcnkpICU+JQogIHBzeWNoOjpkZXNjcmliZSguKQpgYGAKCioqKioKCiMjIFBlYXJzb24gQ29ycmVsYXRpb25zCmBgYHtyfQpzb3VyY2UoImNvcnN0YXJzLlIiKQoKZGF0ICU+JQogIHNlbGVjdChvcmdkZWh1bSwgZXhwbG9pdGF0dCwgd2JhdHQsIHNibG0sIHNvZSwgam9ic2F0LCBhY29tbWl0LCBidXJub3V0LCB0b2ludGVudCwgcGVyZiwgb2NiLCBjd2IsIHNlbGVjdGlvbiwgdHJhaW5pbmcsIGFwcHJhaXNhbCwgY29tcGVuc2F0aW9uLCBocnByYWN0aWNlcywgb3JndHlwZSwgb3Jnc2l6ZSwgb3JnbGV2ZWxzLCBvcmdjZW50LCBnZW5kZXIsIGFnZSwgcmFjZW51bSwgZW5nbGlzaCwgZWR1LCBzdGF0dXMsIG9yZ3RlbnVyZSwgcG9zdGVudXJlLCBzdXB0ZW51cmUsIGRpcnJlcG9ydCwgd2Vla2hvdXJzLCBzYWxhcnkpICU+JQogIGFzLm1hdHJpeCguKSAlPiUKICBjb3JzdGFycyguLCBtZXRob2QgPSAicGVhcnNvbiIpCgpgYGAKCk5vdGU6IFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGFyZSBtZWFzdXJlZCBvbiBhbiBvcmRpbmFsIHNjYWxlOgoKKiBPcmcgc2l6ZQoKKiBPcmcgbGV2ZWxzCgoqIE9yZyBjZW50cmFsaXR5CgoqIFNhbGFyeQoKKiBBZ2UKCiogRWR1Y2F0aW9uCgpVc2UgU3BlYXJtYW4ncyByaG8gZm9yIHRoZXNlIHZhcmlhYmxlcy4KCioqKioKCiMjIFNwZWFybWFuIENvcnJlbGF0aW9ucyBmb3IgT3JkaW5hbCBEZW1vZ3JhcGhpYyBWYXJpYWJsZXMKYGBge3J9CnNvdXJjZSgiY29yc3RhcnMuUiIpCgpkYXQgJT4lCiAgc2VsZWN0KG9yZ2RlaHVtLCBleHBsb2l0YXR0LCB3YmF0dCwgc2JsbSwgc29lLCBqb2JzYXQsIGFjb21taXQsIGJ1cm5vdXQsIHRvaW50ZW50LCBwZXJmLCBvY2IsIGN3Yiwgc2VsZWN0aW9uLCB0cmFpbmluZywgYXBwcmFpc2FsLCBjb21wZW5zYXRpb24sIGhycHJhY3RpY2VzLCBvcmd0eXBlLCBvcmdzaXplLCBvcmdsZXZlbHMsIG9yZ2NlbnQsIGdlbmRlciwgYWdlLCByYWNlbnVtLCBlbmdsaXNoLCBlZHUsIHN0YXR1cywgb3JndGVudXJlLCBwb3N0ZW51cmUsIHN1cHRlbnVyZSwgZGlycmVwb3J0LCB3ZWVraG91cnMsIHNhbGFyeSkgJT4lCiAgYXMubWF0cml4KC4pICU+JQogIGNvcnN0YXJzKC4sIG1ldGhvZCA9ICJzcGVhcm1hbiIpCmBgYAoKU2V2ZXJhbCBpbnRlcmVzdGluZyBvYnNlcnZhdGlvbnM6CgoqIEZvci1wcm9maXQgb3JnYW5pemF0aW9ucyBzaWduaWZpY2FudGx5IHJlbGF0ZWQgdG8gaGlnaGVyIGV4cGxvaXRhdGlvbiBIUiBhdHRyaWJ1dGlvbnMsIEJMTSwgYW5kIG9yZyBkZWh1bWFuaXphdGlvbi4KCiogT3JnIHNpemUgcG9zaXRpdmVseSByZWxhdGVkIHRvIHBlcmZvcm1hbmNlIEhSIGF0dHJpYnV0aW9ucyAmIE9DQiBhbmQgbmVnYXRpdmVseSByZWxhdGVkIHRvIEJMTS4KCiogT3JnIGxldmVscyBwb3NpdGl2bGV5IHJlbGF0ZWQgdG8gZXhwbG9pdGF0aW9uICYgY29zdCBIUiBhdHRyaWJ1dGlvbnMgYW5kIG5lZ2F0aXZlbHkgcmVsYXRlZCB0byBTT0UgJiBQT1MuIEFsc28gcG9zaXRpdmVseSByZWxhdGVkIHRvIGJvdGggT0NCcyBhbmQgQ1dCcy4KCiogU2FsYXJ5IG5lZ2F0aXZlbHkgcmVsYXRlZCB0byBleHBsb2l0YXRpb24gJiBjb3N0IEhSIGF0dHJpYnV0aW9ucywgQkxNICwgJiBvcmcgZGVodW1hbml6YXRpb24gYW5kIHBvc2l0aXZsZXkgcmVsYXRlZCB0byB3ZWxsLWJlaW5nIGF0dHJpYnV0aW9ucyBhbmQgUE9TLgoKKiBCZWluZyByZXNwb25zaWJsZSBmb3IgZGlyZWN0IHJlcG9ydHMgcG9zaXRpdmVseSByZWxhdGVkIHRvIHdlbGwtYmVpbmcgSFIgYXR0cmlidXRpb25zIGFuZCBuZWdhdGl2ZWx5IHJlbGF0ZWQgdG8gb3JnIGRlaHVtYW5pemF0aW9uLgoKKiBUZW51cmUgdmFyaWFibGVzIGFuZCB3ZWVrbHkgaG91cnMgbm90IHJlbGF0ZWQgdG8gdmFyaWFibGVzIG9mIGludGVyZXN0LgoKKiBTdGF0dXMsIGdlbmRlciwgYW5kIGFnZSBub3QgcmVsYXRlZCB0byB2YXJpYWJsZXMgb2YgaW50ZXJlc3QuCgoqKioqCgojIEh5cG90aGVzaXMgVGVzdHMKCioqKioKCiMjIEh5cG90aGVzaXMgMQoKPiBFbXBsb3llZSBIUiBhdHRyaWJ1dGlvbnMgYXJlIHJlbGF0ZWQgdG8gZW1wbG95ZWUgcGVyY2VwdGlvbnMgb2Ygb3JnYW5pemF0aW9uYWwgZGVodW1hbml6YXRpb24uIFNwZWNpZmljYWxseSwgKGEpIGVtcGxveWVlcyB3aG8gdGVuZCB0byBtYWtlIGVtcGxveWVlLWNlbnRyaWMgYXR0cmlidXRpb25zIHBlcmNlaXZlIGxvdyBsZXZlbHMgb2YgZGVodW1hbml6YXRpb24gd2hlcmVhcyAoYikgZW1wbG95ZWVzIHdobyB0ZW5kIHRvIG1ha2Ugb3JnYW5pemF0aW9uY2VudHJpYyBhdHRyaWJ1dGlvbnMgcGVyY2VpdmUgaGlnaCBsZXZlbHMgb2YgZGVodW1hbml6YXRpb24uCgpgYGB7cn0KY29yLnRlc3QoZGF0JHdiYXR0LCBkYXQkb3JnZGVodW0sIG1ldGhvZCA9ICJwZWFyc29uIikKYGBgCgpgYGB7cn0KY29yLnRlc3QoZGF0JGV4cGxvaXRhdHQsIGRhdCRvcmdkZWh1bSwgbWV0aG9kID0gInBlYXJzb24iKQpgYGAKCkh5cG90aGVzaXMgMSBpcyBzdXBwb3J0ZWQuCgpgYGB7cn0KZGF0ICU+JQogIGdncGxvdChhZXMoeCA9IHdiYXR0LCB5ID0gb3JnZGVodW0pKSArIGdlb21fcG9pbnQoKSArIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoIkVtcGxveWVlLWNlbnRyaWMgSFIgQXR0cmlidXRpb25zIiwgYnJlYWtzID0gYygxOjcpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKCJPcmdhbml6YWl0b25hbCBEZWh1bWFuaXphdGlvbiIsIGJyZWFrcyA9IGMoMTo3KSkKYGBgCgpgYGB7cn0KZGF0ICU+JQogIGdncGxvdChhZXMoeCA9IGV4cGxvaXRhdHQsIHkgPSBvcmdkZWh1bSkpICsgZ2VvbV9wb2ludCgpICsgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKwogIHNjYWxlX3hfY29udGludW91cygiT3JnYW5pemF0aW9uLWNlbnRyaWMgSFIgQXR0cmlidXRpb25zIiwgYnJlYWtzID0gYygxOjcpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKCJPcmdhbml6YWl0b25hbCBEZWh1bWFuaXphdGlvbiIsIGJyZWFrcyA9IGMoMTo3KSkKYGBgCgpTaW5jZSBwcmV2aW91cyBkYXRhIGV4cGxvcmF0aW9uIHJldmVhbGVkIHRoYXQgdmFyaWFibGVzIG9mIGludGVyZXN0IGFyZSBub24tbm9ybWFsbHkgZGlzdHJpYnV0ZWQsIGNvbmR1Y3QgdHdvIGFkZGl0aW9uYWwgdGVzdHMgdG8gYWZmaXJtIHJlc3VsdHM6CgoqIEtlbmRhbGwncyB0YXUtYgoKKiBWaXN1YWwgaW5zcGVjdGlvbiBvZiByZWdyZXNzaW9uIGRpYWdub3N0aWMgcGxvdHMKCmBgYHtyfQpjb3IudGVzdChkYXQkd2JhdHQsIGRhdCRvcmdkZWh1bSwgbWV0aG9kID0gImtlbmRhbGwiKQpjb3IudGVzdChkYXQkZXhwbG9pdGF0dCwgZGF0JG9yZ2RlaHVtLCBtZXRob2QgPSAia2VuZGFsbCIpCmBgYAoKYGBge3J9CnBsb3QobG0ob3JnZGVodW0gfiBleHBsb2l0YXR0LCBkYXRhID0gZGF0KSkKYGBgCgpgYGB7cn0KcGxvdChsbShvcmdkZWh1bSB+IHdiYXR0LCBkYXRhID0gZGF0KSkKYGBgCgpLZW5kYWxsJ3MgdGF1IGFsaWducyB3aXRoIFBlYXJzb24ncyByIGFuZCBubyBzaWduaWZpY2FudCBhYm5vcm1hbGl0aWVzIHNwb3R0ZWQgaW4gdGhlIGRpYWdub3N0aWMgcGxvdHMuCgpQbG90IDEgKFJlc2lkYXVzbCB2cyBGaXR0ZWQpIGV4YW1pbmVzIGxpbmVhcml0eS4KClBsb3QgMiAoTm9ybWFsIFEtUSkgZXhhbWluZXMgbm9ybWFsaXR5IG9mIHJlc2lkdWFscy4KClBsb3QgMyAoU2NhbGUtTG9jYXRpb24pIGV4YW1pbmVzIGhldGVyc2NlZGFzdGljaXR5LgoKUGxvdCA0IChSZXNpZHVhbHMgdnMgTGV2ZXJhZ2UpIGV4YW1pbmVzIENvb2sncyBkaXN0YW5jZS4KCgoqKioqCgojIyBIeXBvdGhlc2lzIDIKCj4gU3VwZXJ2aXNvciBib3R0b20tbGluZSBtZW50YWxpdHkgaXMgcG9zaXRpdmVseSByZWxhdGVkIHRvIGVtcGxveWVlIHBlcmNlcHRpb25zIG9mIG9yZ2FuaXphdGlvbmFsIGRlaHVtYW5pemF0aW9uLgoKYGBge3J9CmNvci50ZXN0KGRhdCRzYmxtLCBkYXQkb3JnZGVodW0sIG1ldGhvZCA9ICJwZWFyc29uIikKYGBgCgpIeXBvdGhlc2lzIDIgaXMgc3VwcG9ydGVkLiAKCmBgYHtyfQpkYXQgJT4lCiAgZ2dwbG90KGFlcyh4ID0gc2JsbSwgeSA9IG9yZ2RlaHVtKSkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArCiAgc2NhbGVfeF9jb250aW51b3VzKCJTdXBlcnZpc29yJ3MgQm90dG9tLWxpbmUgTWVudGFsaXR5IiwgYnJlYWtzID0gYygxOjcpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKCJPcmdhbml6YWl0b25hbCBEZWh1bWFuaXphdGlvbiIsIGJyZWFrcyA9IGMoMTo3KSkKYGBgCgpgYGB7cn0KY29yLnRlc3QoZGF0JHNibG0sIGRhdCRvcmdkZWh1bSwgbWV0aG9kID0gImtlbmRhbGwiKQpgYGAKCmBgYHtyfQpwbG90KGxtKG9yZ2RlaHVtIH4gc2JsbSwgZGF0YSA9IGRhdCkpCmBgYAoKKioqKgoKIyMgSHlwb3RoZXNpcyAzCgo+IFN1cGVydmlzb3IgYm90dG9tLWxpbmUgbWVudGFsaXR5IGlzIHJlbGF0ZWQgdG8gSFIgYXR0cmlidXRpb25zIHN1Y2ggdGhhdCAoYSkgZW1wbG95ZWVzIHdpdGggaGlnaCBCTE0gc3VwZXJ2aXNvcnMgYXJlIG1vcmUgbGlrZWx5IHRvIGZvcm0gb3JnYW5pemF0aW9uLWNlbnRyaWMgYXR0cmlidXRpb25zIGFuZCAoYikgZW1wbG95ZWVzIHdpdGggbG93IEJMTSBzdXBlcnZpc29ycyBhcmUgbW9yZSBsaWtlbHkgdG8gZm9ybSBlbXBsb3llZS1jZW50cmljIGF0dHJpYnV0aW9ucy4KCmBgYHtyfQpjb3IudGVzdChkYXQkc2JsbSwgZGF0JGV4cGxvaXRhdHQsIG1ldGhvZCA9ICJwZWFyc29uIikKYGBgCgpgYGB7cn0KY29yLnRlc3QoZGF0JHNibG0sIGRhdCR3YmF0dCwgbWV0aG9kID0gInBlYXJzb24iKQpgYGAKCkh5cG90aGVzaXMgMyBpcyBzdXBwb3J0ZWQuCgpgYGB7cn0KZGF0ICU+JQogIGdncGxvdChhZXMoeCA9IHNibG0sIHkgPSBleHBsb2l0YXR0KSkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArCiAgc2NhbGVfeF9jb250aW51b3VzKCJTdXBlcnZpc29yJ3MgQm90dG9tLWxpbmUgTWVudGFsaXR5IiwgYnJlYWtzID0gYygxOjcpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKCJPcmdhbml6YXRpb24tY2VudHJpYyBIUiBBdHRyaWJ1dGlvbnMiLCBicmVha3MgPSBjKDE6NykpCmBgYAoKYGBge3J9CmRhdCAlPiUKICBnZ3Bsb3QoYWVzKHggPSBzYmxtLCB5ID0gd2JhdHQpKSArIGdlb21fcG9pbnQoKSArIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoIlN1cGVydmlzb3IncyBCb3R0b20tbGluZSBNZW50YWxpdHkiLCBicmVha3MgPSBjKDE6NykpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoIkVtcGxveWVlLWNlbnRyaWMgSFIgQXR0cmlidXRpb25zIiwgYnJlYWtzID0gYygxOjcpKQpgYGAKCmBgYHtyfQpjb3IudGVzdChkYXQkc2JsbSwgZGF0JGV4cGxvaXRhdHQsIG1ldGhvZCA9ICJrZW5kYWxsIikKY29yLnRlc3QoZGF0JHNibG0sIGRhdCR3YmF0dCwgbWV0aG9kID0gImtlbmRhbGwiKQpgYGAKCmBgYHtyfQpwbG90KGxtKGV4cGxvaXRhdHQgfiBzYmxtLCBkYXRhID0gZGF0KSkKYGBgCgpgYGB7cn0KcGxvdChsbSh3YmF0dCB+IHNibG0sIGRhdGEgPSBkYXQpKQpgYGAKCioqKioKCiMjIEh5cG90aGVzaXMgNAoKPiBTdXBlcnZpc29yIGJvdHRvbS1saW5lIG1lbnRhbGl0eSBoYXMgYSBwb3NpdGl2ZSBpbmRpcmVjdCBlZmZlY3Qgb24gZW1wbG95ZWUgcGVyY2VwdGlvbnMgb2Ygb3JnYW5pemF0aW9uYWwgZGVodW1hbml6YXRpb24gdGhyb3VnaCBIUiBhdHRyaWJ1dGlvbnMuIFNwZWNpZmljYWxseSwgc3VwZXJ2aXNvciBCTE0gcmVsYXRlcyB0byBvcmdhbml6YXRpb25hbCBkZWh1bWFuaXphdGlvbiB0aHJvdWdoIGl0cyAoYSkgcG9zaXRpdmUgZWZmZWN0IG9uIG9yZ2FuaXphdGlvbmNlbnRyaWMgYXR0cmlidXRpb25zIGFuZCAoYikgbmVnYXRpdmUgZWZmZWN0IG9uIGVtcGxveWVlLWNlbnRyaWMgYXR0cmlidXRpb25zLgoKYGBge3J9CnN1bW1hcnkobG0oZXhwbG9pdGF0dCB+IHNibG0sIGRhdGEgPSBkYXQpKQpgYGAKCmBgYHtyfQpzdW1tYXJ5KG1lZGlhdGUob3JnZGVodW0gfiBzYmxtICsgKGV4cGxvaXRhdHQpLCBkYXRhID0gZGF0LCBuLml0ZXIgPSAxMDAwMCwgemVybyA9IFRSVUUpLCBkaWdpdHMgPSA0KQpgYGAKCkNvbmZpcm1pbmcgdGhlIEYtc3RhdGlzdGljIGNhbiBiZSBjYWxjdWxhdGUgZm9yIGxhdGVyLgpgYGB7cn0KZGYxIDwtIGsgPC0gIGxlbmd0aChjKCJiIiwgImMiKSkKbiA8LSA0MDAKZGYyIDwtIG4gLSBrCnIyIDwtIC42MDI0CmZzdGF0IDwtIChyMi8oMS1yMikpKihkZjIvZGYxKQoKZGF0YS5mcmFtZSgiRi1zdGF0aXN0aWMiID0gZnN0YXQsICJkZjEiID0gZGYxLCAiZGYyIiA9IGRmMikKYGBgCgoKYGBge3J9CnN1bW1hcnkobG0od2JhdHQgfiBzYmxtLCBkYXRhID0gZGF0KSkKYGBgCgpgYGB7cn0Kc3VtbWFyeShtZWRpYXRlKG9yZ2RlaHVtIH4gc2JsbSArICh3YmF0dCksIGRhdGEgPSBkYXQsIG4uaXRlciA9IDEwMDAwLCB6ZXJvID0gVFJVRSksIGRpZ2l0cyA9IDQpCmBgYAoKQ29uZmlybWluZyB0aGUgRi1zdGF0aXN0aWMgY2FuIGJlIGNhbGN1bGF0ZSBmb3IgbGF0ZXIuCmBgYHtyfQpkZjEgPC0gayA8LSAgbGVuZ3RoKGMoImIiLCAiYyIpKQpuIDwtIDQwMApkZjIgPC0gbiAtIGsKcjIgPC0gLjU5NzkKZnN0YXQgPC0gKHIyLygxLXIyKSkqKGRmMi9kZjEpCgpkYXRhLmZyYW1lKCJGLXN0YXRpc3RpYyIgPSBmc3RhdCwgImRmMSIgPSBkZjEsICJkZjIiID0gZGYyKQpgYGAKClNpbmNlIHRoZSBwc3ljaDo6bWVkaWF0ZSBmdW5jdGlvbiBhcHBlYXJzIHRvIG9ubHkgY2FsY3VsYXRlIHBlcmNlbnRpbGUgYm9vdHN0cmFwcyBhbmQgbm90IGJpYXMtY29ycmVjdGVkIGJvb3RzdHJhcHMsIHJlcnVuIGFuYWx5c2lzIGluIGxhdmFhbi4KCmBgYHtyfQppbmRpcmVjdC5leHBsb2l0IDwtICcKICAjIGRpcmVjdCBlZmZlY3QKICAgIG9yZ2RlaHVtIH4gYypzYmxtCiAgIyBtZWRpYXRvcgogICAgZXhwbG9pdGF0dCB+IGEqc2JsbQogICAgb3JnZGVodW0gfiBiKmV4cGxvaXRhdHQKICAjIGluZGlyZWN0IGVmZmVjdAogICAgYWIgOj0gYSpiJwoKaW5kaXJlY3QuZXhwbG9pdC5maXQgPC0gc2VtKGluZGlyZWN0LmV4cGxvaXQsIGRhdGEgPSBkYXQsIHNlID0gImJvb3QiLCBib290c3RyYXAgPSAxMDAwMCwgbWVhbnN0cnVjdHVyZSA9IFRSVUUpCnBhcmFtZXRlckVzdGltYXRlcyhpbmRpcmVjdC5leHBsb2l0LmZpdCwgYm9vdC5jaS50eXBlID0gInBlcmMiKQpwYXJhbWV0ZXJFc3RpbWF0ZXMoaW5kaXJlY3QuZXhwbG9pdC5maXQsIGJvb3QuY2kudHlwZSA9ICJiY2Euc2ltcGxlIikKYGBgCgpgYGB7cn0Kc3VtbWFyeShpbmRpcmVjdC5leHBsb2l0LmZpdCwgc3RhbmRhcmRpemVkID0gRkFMU0UpCmBgYAoKQ2FsY3VsYXRpbmcgdGhlIEYtc3RhdGlzdGljCmBgYHtyfQpkZjEgPC0gayA8LSAgbGVuZ3RoKGMoImIiLCAiYyIpKQpuIDwtIG5vYnMoaW5kaXJlY3QuZXhwbG9pdC5maXQpCmRmMiA8LSBuIC0gawpyMiA8LSBpbnNwZWN0KGluZGlyZWN0LmV4cGxvaXQuZml0LCAicnNxdWFyZSIpW1sxXV0KZnN0YXQgPC0gKHIyLygxLXIyKSkqKGRmMi9kZjEpICMgRi1zdGF0aXN0aWMKCmRhdGEuZnJhbWUoIkYtc3RhdGlzdGljIiA9IGZzdGF0LCAiZGYxIiA9IGRmMSwgImRmMiIgPSBkZjIpCmBgYAoKYGBge3J9CmluZGlyZWN0LndiIDwtICcKICAjIGRpcmVjdCBlZmZlY3QKICAgIG9yZ2RlaHVtIH4gYypzYmxtCiAgIyBtZWRpYXRvcgogICAgd2JhdHQgfiBhKnNibG0KICAgIG9yZ2RlaHVtIH4gYip3YmF0dAogICMgaW5kaXJlY3QgZWZmZWN0CiAgICBhYiA6PSBhKmInCgppbmRpcmVjdC53Yi5maXQgPC0gc2VtKGluZGlyZWN0LndiLCBkYXRhID0gZGF0LCBzZSA9ICJib290IiwgYm9vdHN0cmFwID0gMTAwMDAsIG1lYW5zdHJ1Y3R1cmUgPSBUUlVFKQpwYXJhbWV0ZXJFc3RpbWF0ZXMoaW5kaXJlY3Qud2IuZml0LCBib290LmNpLnR5cGUgPSAicGVyYyIpCnBhcmFtZXRlckVzdGltYXRlcyhpbmRpcmVjdC53Yi5maXQsIGJvb3QuY2kudHlwZSA9ICJiY2Euc2ltcGxlIikKYGBgCgpgYGB7cn0Kc3VtbWFyeShpbmRpcmVjdC53Yi5maXQsIHN0YW5kYXJkaXplZCA9IEZBTFNFKQpgYGAKCkNhbGN1bGF0aW5nIHRoZSBGLXN0YXRpc3RpYwpgYGB7cn0KZGYxIDwtIGsgPC0gIGxlbmd0aChjKCJiIiwgImMiKSkKbiA8LSBub2JzKGluZGlyZWN0LndiLmZpdCkKZGYyIDwtIG4gLSBrCnIyIDwtIGluc3BlY3QoaW5kaXJlY3Qud2IuZml0LCAicnNxdWFyZSIpW1sxXV0KZnN0YXQgPC0gKHIyLygxLXIyKSkqKGRmMi9kZjEpICMgRi1zdGF0aXN0aWMKCmRhdGEuZnJhbWUoIkYtc3RhdGlzdGljIiA9IGZzdGF0LCAiZGYxIiA9IGRmMSwgImRmMiIgPSBkZjIpCmBgYAoKSHlwb3RoZXNpcyA0IGlzIHN1cHBvcnRlZC4KCiMjIEh5cG90aGVzaXMgNQoKPiBTdXBlcnZpc29yIG9yZ2FuaXphdGlvbmFsIGVtYm9kaW1lbnQgbW9kZXJhdGVzIHRoZSBwb3NpdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzdXBlcnZpc29yIGJvdHRvbS1saW5lIG1lbnRhbGl0eSBhbmQgZW1wbG95ZWUgcGVyY2VwdGlvbnMgb2Ygb3JnYW5pemF0aW9uYWwgZGVodW1hbml6YXRpb24uIFNwZWNpZmljYWxseSwgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHN1cGVydmlzb3IgQkxNIGFuZCBvcmdhbml6YXRpb25hbCBkZWh1bWFuaXphdGlvbiBzaG91bGQgYmUgbW9yZSAobGVzcykgcG9zaXRpdmUgYXQgaGlnaCAobG93KSBsZXZlbHMgb2Ygc3VwZXJ2aXNvciBvcmdhbml6YXRpb25hbCBlbWJvZGltZW50LgoKYGBge3J9CnN1bW1hcnkobG0ob3JnZGVodW0gfiBzYmxtYypzb2VjLCBkYXRhID0gZGF0KSkKYGBgCgojIyMgUGxvdCBJbnRlcmFjdGlvbiAoRmFjdG9yIFByZWRpY3RvcikKYGBge3J9Cm1vZDEgPC0gbG0ob3JnZGVodW0gfiBzYmxtYypzb2VjLCBkYXRhID0gZGF0KQppbnRlci5zZCA8LSBlZmZlY3QoYygic2JsbWMqc29lYyIpLCBtb2QxLAogICAgICAgICAgICAgICAgICAgICB4bGV2ZWxzID0gbGlzdChzYmxtYyA9IGMoLXNkKGRhdCRzYmxtYyksICtzZChkYXQkc2JsbWMpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvZWMgPSBjKC1zZChkYXQkc29lYyksICtzZChkYXQkc29lYykpKSkKaW50ZXIuc2QgPC0gYXMuZGF0YS5mcmFtZShpbnRlci5zZCkKCiMgQ3JlYXRlIGZhY3RvcnMgb2YgdGhlIGRpZmZlcmVudCB2YXJpYWJsZXMKaW50ZXIuc2Qkc2JsbSA8LSBmYWN0b3IoaW50ZXIuc2Qkc2JsbWMsCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKC1zZChkYXQkc2JsbWMpLCArc2QoZGF0JHNibG1jKSksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCItMSBTRCBTQkxNIiwgIisgMSBTRCBTQkxNIikpCiAgICAgICAgICAgICAgICAgICAgIAppbnRlci5zZCRzb2UgPC0gZmFjdG9yKGludGVyLnNkJHNvZWMsCiAgICAgICAgICAgICAgbGV2ZWxzID0gYygtc2QoZGF0JHNvZSksICtzZChkYXQkc29lYykpLAogICAgICAgICAgICAgIGxhYmVscyA9IGMoIi0xIFNEIFNPRSIsICIrMSBTRCBTT0UiKSkKCiMgUGxvdCAKZ2dwbG90KGRhdGEgPSBpbnRlci5zZCwgYWVzKHggPSBzYmxtLCB5ID0gZml0LCBncm91cCA9IHNvZSwgc2hhcGUgPSBzb2UsIGxpbmV0eXBlID0gc29lKSkgKwogICAgICBnZW9tX3BvaW50KHNpemUgPSAzKSArIGdlb21fbGluZShzaXplID0gMSkgKwogICAgICBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gYygiZGFzaGVkIiwgInNvbGlkIikpICsKICAgICAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTcsIDE2KSkgKwogICAgICBzY2FsZV94X2Rpc2NyZXRlKCJTdXBlcnZpc29yJ3MgQm90dG9tLUxpbmUgTWVudGFsaXR5IikgKwogICAgICBzY2FsZV95X2NvbnRpbnVvdXMoIk9yZ2FuaXphdGlvbmFsIERlaHVtYW5pemF0aW9uIiwgbGltaXRzID0gYygxLCA3KSwgYnJlYWtzID0gYygxOjcpKSArCiAgICAgIGd1aWRlcyhzaGFwZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9IE5VTEwsIHJldmVyc2UgPSBUUlVFLCBrZXl3aWR0aCA9IDUpLAogICAgICAgICAgICAgbGluZXR5cGUgPSBndWlkZV9sZWdlbmQodGl0bGUgPSBOVUxMLCByZXZlcnNlID0gVFJVRSwga2V5d2lkdGggPSA1KSkgKwogICAgICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpCmBgYAoKIyMjIFBsb3QgSW50ZXJhY3Rpb24gKENvbnRpbnVvdXMgUHJlZGljdG9yKQpgYGB7cn0Kcm0obW9kMSkKcm0oaW50ZXIuc2QpCgptb2QxIDwtIGxtKG9yZ2RlaHVtIH4gc2JsbSpzb2UsIGRhdGEgPSBkYXQpCmludGVyLnNkIDwtIGVmZmVjdChjKCJzYmxtKnNvZSIpLCBtb2QxLAogICAgICAgICAgICAgICAgICAgeGxldmVscyA9IGxpc3Qoc2JsbSA9IGMoMTo3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvZSA9IGMobWVhbihkYXQkc29lKS1zZChkYXQkc29lKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW4oZGF0JHNvZSkrc2QoZGF0JHNvZSkpKSkKaW50ZXIuc2QgPC0gYXMuZGF0YS5mcmFtZShpbnRlci5zZCkKCiMgQ3JlYXRlIGZhY3RvcnMgb2YgdGhlIG1vZGVyYXRvcgoKaW50ZXIuc2Qkc29lIDwtIGZhY3RvcihpbnRlci5zZCRzb2UsCiAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYyhtZWFuKGRhdCRzb2UpLXNkKGRhdCRzb2UpLCBtZWFuKGRhdCRzb2UpK3NkKGRhdCRzb2VjKSksCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiLTEgU0QgU09FIiwgIisxIFNEIFNPRSIpKQoKIyBQbG90IApnZ3Bsb3QoZGF0YSA9IGludGVyLnNkLCBhZXMoeCA9IHNibG0sIHkgPSBmaXQsIGdyb3VwID0gc29lLCBsaW5ldHlwZSA9IHNvZSkpICsKICBnZW9tX2xpbmUoc2l6ZSA9IDEpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gYygiZGFzaGVkIiwgInNvbGlkIikpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoIlN1cGVydmlzb3IncyBCb3R0b20tTGluZSBNZW50YWxpdHkiLCBsaW1pdHMgPSBjKDEsIDcpLCBicmVha3MgPSBjKDE6NykpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoIk9yZ2FuaXphdGlvbmFsIERlaHVtYW5pemF0aW9uIiwgbGltaXRzID0gYygxLCA3KSwgYnJlYWtzID0gYygxOjcpKSArCiAgZ3VpZGVzKHNoYXBlID0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gTlVMTCwgcmV2ZXJzZSA9IFRSVUUsIGtleXdpZHRoID0gNSksCiAgICAgICAgIGxpbmV0eXBlID0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gTlVMTCwgcmV2ZXJzZSA9IFRSVUUsIGtleXdpZHRoID0gNSkpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpCmBgYAoKIyMjIE9idGFpbmluZyBNU0UgZm9yIFJlcG9ydGluZwpgYGB7cn0KYyhjcm9zc3Byb2QobW9kMSRyZXNpZHVhbHMpKS9sZW5ndGgobW9kMSRyZXNpZHVhbHMpCmBgYAoKSHlwb3RoZXNpcyA1IGlzIHN1cHBvcnRlZC4KCiogTm90YWJseSwgU09FIGV4aGliaXRzIGEgbmVnYXRpdmUgbWFpbiBlZmZlY3Qgb24gb3JnYW5pemF0aW9uYWwgZGVodW1hbml6YXRpb24uCgojIyBIeXBvdGhlc2lzIDYKCj4gU3VwZXJ2aXNvcuKAmXMgb3JnYW5pemF0aW9uYWwgZW1ib2RpbWVudCBtb2RlcmF0ZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHN1cGVydmlzb3IgYm90dG9tLWxpbmUgbWVudGFsaXR5IGFuZCBlbXBsb3llZSBIUiBhdHRyaWJ1dGlvbnMuIFNwZWNpZmljYWxseSwgaGlnaCAobG93KSBzdXBlcnZpc29yIEJMTSBpcyBtb3JlIHN0cm9uZ2x5IHJlbGF0ZWQgdG8gb3JnYW5pemF0aW9uLWNlbnRyaWMgKGVtcGxveWVlLWNlbnRyaWMpIEhSIGF0dHJpYnV0aW9ucyBhdCBoaWdoIGxldmVscyBvZiBzdXBlcnZpc29y4oCZcyBvcmdhbml6YXRpb25hbCBlbWJvZGltZW50LgoKYGBge3J9CnN1bW1hcnkobG0oZXhwbG9pdGF0dCB+IHNibG1jKnNvZWMsIGRhdGEgPSBkYXQpKQpgYGAKCiMjIyBPcmdhbml6YXRpb24tQ2VudHJpYyBIUiBBdHRyaWJ1dGlvbnMKCiMjIyMgUGxvdCBJbnRlcmFjdGlvbiAoRmFjdG9yIFByZWRpY3RvcikKYGBge3J9CnJtKGludGVyLnNkKQoKbW9kMiA8LSBsbShleHBsb2l0YXR0IH4gc2JsbWMqc29lYywgZGF0YSA9IGRhdCkKaW50ZXIuc2QgPC0gZWZmZWN0KGMoInNibG1jKnNvZWMiKSwgbW9kMiwKICAgICAgICAgICAgICAgICAgICAgeGxldmVscyA9IGxpc3Qoc2JsbWMgPSBjKC1zZChkYXQkc2JsbWMpLCArc2QoZGF0JHNibG1jKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2VjID0gYygtc2QoZGF0JHNvZWMpLCArc2QoZGF0JHNvZWMpKSkpCmludGVyLnNkIDwtIGFzLmRhdGEuZnJhbWUoaW50ZXIuc2QpCgojIENyZWF0ZSBmYWN0b3JzIG9mIHRoZSBkaWZmZXJlbnQgdmFyaWFibGVzCmludGVyLnNkJHNibG0gPC0gZmFjdG9yKGludGVyLnNkJHNibG1jLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygtc2QoZGF0JHNibG1jKSwgc2QoZGF0JHNibG1jKSksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCItMSBTRCBTQkxNIiwgIisgMSBTRCBTQkxNIikpCiAgICAgICAgICAgICAgICAgICAgIAppbnRlci5zZCRzb2UgPC0gZmFjdG9yKGludGVyLnNkJHNvZWMsCiAgICAgICAgICAgICAgbGV2ZWxzID0gYygtc2QoZGF0JHNvZWMpLCBzZChkYXQkc29lYykpLAogICAgICAgICAgICAgIGxhYmVscyA9IGMoIi0xIFNEIFNPRSIsICIrMSBTRCBTT0UiKSkKCiMgUGxvdCAKZ2dwbG90KGRhdGEgPSBpbnRlci5zZCwgYWVzKHggPSBzYmxtLCB5ID0gZml0LCBncm91cCA9IHNvZSwgc2hhcGUgPSBzb2UsIGxpbmV0eXBlID0gc29lKSkgKwogICAgICBnZW9tX3BvaW50KHNpemUgPSAzKSArIGdlb21fbGluZShzaXplID0gMSkgKwogICAgICBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gYygiZGFzaGVkIiwgInNvbGlkIikpICsKICAgICAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTcsIDE2KSkgKyAgICAgIAogICAgICBzY2FsZV94X2Rpc2NyZXRlKCJTdXBlcnZpc29yJ3MgQm90dG9tLUxpbmUgTWVudGFsaXR5IikgKwogICAgICBzY2FsZV95X2NvbnRpbnVvdXMoIk9yZ2FuaXphdGlvbi1jZW50cmljIEhSIEF0dHJpYnV0aW9ucyIsIGxpbWl0cyA9IGMoMSwgNyksIGJyZWFrcyA9IGMoMTo3KSkgKwogICAgICBndWlkZXMoc2hhcGUgPSBndWlkZV9sZWdlbmQodGl0bGUgPSBOVUxMLCByZXZlcnNlID0gVFJVRSwga2V5d2lkdGggPSA1KSwKICAgICAgICAgICAgIGxpbmV0eXBlID0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gTlVMTCwgcmV2ZXJzZSA9IFRSVUUsIGtleXdpZHRoID0gNSkpICsKICAgICAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpKQpgYGAKCiMjIyMgUGxvdCBJbnRlcmFjdGlvbiAoQ29udGludW91cyBQcmVkaWN0b3IpCmBgYHtyfQpybShtb2QyKQpybShpbnRlci5zZCkKCm1vZDIgPC0gbG0oZXhwbG9pdGF0dCB+IHNibG0qc29lLCBkYXRhID0gZGF0KQppbnRlci5zZCA8LSBlZmZlY3QoYygic2JsbSpzb2UiKSwgbW9kMiwKICAgICAgICAgICAgICAgICAgIHhsZXZlbHMgPSBsaXN0KHNibG0gPSBjKDE6NyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2UgPSBjKG1lYW4oZGF0JHNvZSktc2QoZGF0JHNvZSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuKGRhdCRzb2UpK3NkKGRhdCRzb2UpKSkpCmludGVyLnNkIDwtIGFzLmRhdGEuZnJhbWUoaW50ZXIuc2QpCgojIENyZWF0ZSBmYWN0b3JzIG9mIHRoZSBtb2RlcmF0b3IKCmludGVyLnNkJHNvZSA8LSBmYWN0b3IoaW50ZXIuc2Qkc29lLAogICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMobWVhbihkYXQkc29lKS1zZChkYXQkc29lKSwgbWVhbihkYXQkc29lKStzZChkYXQkc29lYykpLAogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIi0xIFNEIFNPRSIsICIrMSBTRCBTT0UiKSkKCiMgUGxvdCAKZ2dwbG90KGRhdGEgPSBpbnRlci5zZCwgYWVzKHggPSBzYmxtLCB5ID0gZml0LCBncm91cCA9IHNvZSwgbGluZXR5cGUgPSBzb2UpKSArCiAgZ2VvbV9saW5lKHNpemUgPSAxKSArCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcyA9IGMoImRhc2hlZCIsICJzb2xpZCIpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKCJTdXBlcnZpc29yJ3MgQm90dG9tLUxpbmUgTWVudGFsaXR5IiwgbGltaXRzID0gYygxLCA3KSwgYnJlYWtzID0gYygxOjcpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKCJPcmdhbml6YXRpb24tQ2VudHJpYyBIUiBBdHRyaWJ1dGlvbnMiLCBsaW1pdHMgPSBjKDEsIDcpLCBicmVha3MgPSBjKDE6NykpICsKICBndWlkZXMoc2hhcGUgPSBndWlkZV9sZWdlbmQodGl0bGUgPSBOVUxMLCByZXZlcnNlID0gVFJVRSwga2V5d2lkdGggPSA1KSwKICAgICAgICAgbGluZXR5cGUgPSBndWlkZV9sZWdlbmQodGl0bGUgPSBOVUxMLCByZXZlcnNlID0gVFJVRSwga2V5d2lkdGggPSA1KSkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSkKYGBgCgojIyMjIE9idGFpbmluZyBNU0UgZm9yIFJlcG9ydGluZwpgYGB7cn0KYyhjcm9zc3Byb2QobW9kMiRyZXNpZHVhbHMpKS9sZW5ndGgobW9kMiRyZXNpZHVhbHMpCmBgYAoKIyMjIEVtcGxveWVlLUNlbnRyaWMgSFIgQXR0cmlidXRpb25zCmBgYHtyfQpzdW1tYXJ5KGxtKHdiYXR0IH4gc2JsbWMqc29lYywgZGF0YSA9IGRhdCkpCmBgYAoKIyMjIyBQbG90IEludGVyYWN0aW9uIChGYWN0b3IgUHJlZGljdG9yKQpgYGB7cn0Kcm0oaW50ZXIuc2QpCgptb2QzIDwtIGxtKHdiYXR0IH4gc2JsbWMqc29lYywgZGF0YSA9IGRhdCkKaW50ZXIuc2QgPC0gZWZmZWN0KGMoInNibG1jKnNvZWMiKSwgbW9kMywKICAgICAgICAgICAgICAgICAgICAgeGxldmVscyA9IGxpc3Qoc2JsbWMgPSBjKC1zZChkYXQkc2JsbWMpLCArc2QoZGF0JHNibG1jKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2VjID0gYygtc2QoZGF0JHNvZWMpLCArc2QoZGF0JHNvZWMpKSkpCmludGVyLnNkIDwtIGFzLmRhdGEuZnJhbWUoaW50ZXIuc2QpCgojIENyZWF0ZSBmYWN0b3JzIG9mIHRoZSBkaWZmZXJlbnQgdmFyaWFibGVzCmludGVyLnNkJHNibG0gPC0gZmFjdG9yKGludGVyLnNkJHNibG1jLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygtc2QoZGF0JHNibG1jKSwgc2QoZGF0JHNibG1jKSksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCItMSBTRCBTQkxNIiwgIisgMSBTRCBTQkxNIikpCiAgICAgICAgICAgICAgICAgICAgIAppbnRlci5zZCRzb2UgPC0gZmFjdG9yKGludGVyLnNkJHNvZWMsCiAgICAgICAgICAgICAgbGV2ZWxzID0gYygtc2QoZGF0JHNvZWMpLCBzZChkYXQkc29lYykpLAogICAgICAgICAgICAgIGxhYmVscyA9IGMoIi0xIFNEIFNPRSIsICIrMSBTRCBTT0UiKSkKCiMgUGxvdCAKZ2dwbG90KGRhdGEgPSBpbnRlci5zZCwgYWVzKHggPSBzYmxtLCB5ID0gZml0LCBncm91cCA9IHNvZSwgc2hhcGUgPSBzb2UsIGxpbmV0eXBlID0gc29lKSkgKwogICAgICBnZW9tX3BvaW50KHNpemUgPSAzKSArIGdlb21fbGluZShzaXplID0gMSkgKwogICAgICBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gYygiZGFzaGVkIiwgInNvbGlkIikpICsKICAgICAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTcsIDE2KSkgKwogICAgICBzY2FsZV94X2Rpc2NyZXRlKCJTdXBlcnZpc29yJ3MgQm90dG9tLUxpbmUgTWVudGFsaXR5IikgKwogICAgICBzY2FsZV95X2NvbnRpbnVvdXMoIkVtcGxveWVlLWNlbnRyaWMgSFIgQXR0cmlidXRpb25zIiwgbGltaXRzID0gYygxLCA3KSwgYnJlYWtzID0gYygxOjcpKSArCiAgICAgIGd1aWRlcyhzaGFwZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9IE5VTEwsIHJldmVyc2UgPSBUUlVFLCBrZXl3aWR0aCA9IDUpLAogICAgICAgICAgICAgbGluZXR5cGUgPSBndWlkZV9sZWdlbmQodGl0bGUgPSBOVUxMLCByZXZlcnNlID0gVFJVRSwga2V5d2lkdGggPSA1KSkgKwogICAgICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpCmBgYAoKIyMjIyBQbG90IEludGVyYWN0aW9uIChDb250aW51b3VzIFByZWRpY3RvcikKYGBge3J9CnJtKG1vZDMpCnJtKGludGVyLnNkKQoKbW9kMyA8LSBsbSh3YmF0dCB+IHNibG0qc29lLCBkYXRhID0gZGF0KQppbnRlci5zZCA8LSBlZmZlY3QoYygic2JsbSpzb2UiKSwgbW9kMywKICAgICAgICAgICAgICAgICAgIHhsZXZlbHMgPSBsaXN0KHNibG0gPSBjKDE6NyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2UgPSBjKG1lYW4oZGF0JHNvZSktc2QoZGF0JHNvZSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuKGRhdCRzb2UpK3NkKGRhdCRzb2UpKSkpCmludGVyLnNkIDwtIGFzLmRhdGEuZnJhbWUoaW50ZXIuc2QpCgojIENyZWF0ZSBmYWN0b3JzIG9mIHRoZSBtb2RlcmF0b3IKCmludGVyLnNkJHNvZSA8LSBmYWN0b3IoaW50ZXIuc2Qkc29lLAogICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMobWVhbihkYXQkc29lKS1zZChkYXQkc29lKSwgbWVhbihkYXQkc29lKStzZChkYXQkc29lYykpLAogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIi0xIFNEIFNPRSIsICIrMSBTRCBTT0UiKSkKCiMgUGxvdCAKZ2dwbG90KGRhdGEgPSBpbnRlci5zZCwgYWVzKHggPSBzYmxtLCB5ID0gZml0LCBncm91cCA9IHNvZSwgbGluZXR5cGUgPSBzb2UpKSArCiAgZ2VvbV9saW5lKHNpemUgPSAxKSArCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcyA9IGMoImRhc2hlZCIsICJzb2xpZCIpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKCJTdXBlcnZpc29yJ3MgQm90dG9tLUxpbmUgTWVudGFsaXR5IiwgbGltaXRzID0gYygxLCA3KSwgYnJlYWtzID0gYygxOjcpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKCJFbXBsb3llZS1DZW50cmljIEhSIEF0dHJpYnV0aW9ucyIsIGxpbWl0cyA9IGMoMSwgNyksIGJyZWFrcyA9IGMoMTo3KSkgKwogIGd1aWRlcyhzaGFwZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9IE5VTEwsIHJldmVyc2UgPSBUUlVFLCBrZXl3aWR0aCA9IDUpLAogICAgICAgICBsaW5ldHlwZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9IE5VTEwsIHJldmVyc2UgPSBUUlVFLCBrZXl3aWR0aCA9IDUpKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpKQpgYGAKCiMjIyMgT2J0YWluaW5nIE1TRSBmb3IgUmVwb3J0aW5nCmBgYHtyfQpjKGNyb3NzcHJvZChtb2QzJHJlc2lkdWFscykpL2xlbmd0aChtb2QzJHJlc2lkdWFscykKYGBgCgpIeXBvdGhlc2lzIDYgaXMgcGFydGlhbGx5IHN1cHBvcnRlZC4KCiogU3VwcG9ydGVkIGZvciBvcmdhbml6YXRpb24tY2VudHJpYyBhdHRyaWJ1dGlvbnMuCgoqIE5vdCBzdXBwb3J0ZWQgZm9yIGVtcGxveWVlLWNlbnRyaWMgYXR0cmlidXRpb25zLgoKKiBOb3RhYmx5LCBTT0UgYXBwZWFycyB0byBleGhpYml0IGEgc3Vic3RhbnRpYWwgbWFpbiBlZmZlY3QuIFNPRSBwb3NpdGl2ZWx5IGltcGFjdHMgZW1wbG95ZWUtY2VudHJpYyBhdHRyaWJ1dGlvbnMgYW5kIG5lZ2F0aXZlbHkgaW1wYWN0cyBvcmdhbml6YXRpb24tY2VudHJpYyBhdHRyaWJ1dGlvbnMuCgojIyBIeXBvdGhlc2lzIDcKCj4gU3VwZXJ2aXNvcuKAmXMgb3JnYW5pemF0aW9uYWwgZW1ib2RpbWVudCBtb2RlcmF0ZXMgdGhlIHBvc2l0aXZlIGluZGlyZWN0IGVmZmVjdCBvZiBzdXBlcnZpc29yIGJvdHRvbS1saW5lIG1lbnRhbGl0eSBvbiBlbXBsb3llZSBwZXJjZXB0aW9ucyBvZiBvcmdhbml6YXRpb25hbCBkZWh1bWFuaXphdGlvbiB0aHJvdWdoIEhSIGF0dHJpYnV0aW9ucy4gU3BlY2lmaWNhbGx5LCB0aGUgaW5kaXJlY3QgZWZmZWN0IG9mIHN1cGVydmlzb3IgQkxNIG9uIG9yZ2FuaXphdGlvbmFsIGRlaHVtYW5pemF0aW9uIGlzIG1vcmUgcG9zaXRpdmUgYXQgaGlnaCBsZXZlbHMgb2Ygc3VwZXJ2aXNvcuKAmXMgb3JnYW5pemF0aW9uYWwgZW1ib2RpbWVudC4KCiMjIyBVc2luZyBwc3ljaDo6bWVkaWF0ZQoKYGBge3J9CnN1bW1hcnkobWVkaWF0ZShvcmdkZWh1bSB+IHNibG0qc29lICsgKGV4cGxvaXRhdHQpLCBkYXRhID0gZGF0LCBuLml0ZXIgPSAxMDAwMCwgemVybyA9IFRSVUUpLCBkaWdpdHMgPSA0KQpgYGAKCmBgYHtyfQpzdW1tYXJ5KG1lZGlhdGUob3JnZGVodW0gfiBzYmxtKnNvZSArICh3YmF0dCksIGRhdGEgPSBkYXQsIG4uaXRlciA9IDEwMDAwLCB6ZXJvID0gVFJVRSksIGRpZ2l0cyA9IDQpCmBgYAoKVGhlIHBzeWNoOjptZWRpYXRlIGZ1bmN0aW9uIGRvZXMgbm90IGFwcGVhciBhcHByb3ByaWF0ZSBmb3IgdGhpcyBhbmFseXNpcyBhcyBpdCBpbmNsdWRlcyBhbiBlc3RpbWF0ZSBvZiB0aGUgaW50ZXJhY3Rpb24gdGVybSBvbiB0aGUgb3V0Y29tZSB2YXJpYWJsZSAoYyczKS4gVGhpcyBhcHBlYXJzIHRvIGJlIGFuIGFuYWx5c2lzIGZvciBNb2RlbCA4IG9mIFByb2Nlc3MsIG5vdCBNb2RlbCA3LgoKIyMjIFVzaW5nIGxhdmFhbjo6c2VtCgpOZWVkIHRvIG1hbnVhbGx5IGNyZWF0ZSBpbnRlcmFjdGlvbiB0ZXJtIGZvciBsYXZhYW4uCmBgYHtyfQpkYXQgJTw+JQogIG11dGF0ZShzYmxteHNvZSA9IHNibG0qc29lKSAlPiUgIyBVbmNlbnRlcmVkCiAgbXV0YXRlKHNibG1jeHNvZWMgPSBzYmxtYypzb2VjKSAjIENlbnRlcmVkCmBgYAoKYGBge3J9CnN1bW1hcnkobG0oZXhwbG9pdGF0dCB+IHNibG1jKnNvZWMsIGRhdGEgPSBkYXQpKQpgYGAKCmBgYHtyfQpkZjEgPC0gayA8LSAgbGVuZ3RoKGMoImExIiwgImEyIiwgImEzIikpCm4gPC0gNDAwCmRmMiA8LSBuIC0gawpyMiA8LSAuMzk0CmZzdGF0IDwtIChyMi8oMS1yMikpKihkZjIvZGYxKSAjIEYtc3RhdGlzdGljCgpkYXRhLmZyYW1lKCJGLXN0YXRpc3RpYyIgPSBmc3RhdCwgImRmMSIgPSBkZjEsICJkZjIiID0gZGYyKQpgYGAKCmBgYHtyfQpjb25kaW5kaXJlY3QuZXhwbG9pdCA8LSAnCiAgIyBkaXJlY3QgZWZmZWN0CiAgICBvcmdkZWh1bSB+IGMqc2JsbWMKICAjIG1lZGlhdG9yCiAgICBleHBsb2l0YXR0IH4gYTEqc2JsbWMgKyBhMipzb2VjICsgYTMqc2JsbWN4c29lYwogICAgb3JnZGVodW0gfiBiKmV4cGxvaXRhdHQKICAjIGluZGlyZWN0IGVmZmVjdCAoaW5kZXggb2YgbW9kZXJhdGVkIG1lZGlhdGlvbikKICAgIGFiIDo9IGEzKmIKICAjIHRvdGFsIGVmZmVjdAogICAgdG90YWwgOj0gYyArIChhMSArIGEyICsgYTMpKmIKJwogICAgCmNvbmRpbmRpcmVjdC5leHBsb2l0LmZpdCA8LSBzZW0oY29uZGluZGlyZWN0LmV4cGxvaXQsIGRhdGEgPSBkYXQsIHNlID0gImJvb3QiLCBib290c3RyYXAgPSAxMDAwMCwgbWVhbnN0cnVjdHVyZSA9IFRSVUUpCnBhcmFtZXRlckVzdGltYXRlcyhjb25kaW5kaXJlY3QuZXhwbG9pdC5maXQsIGJvb3QuY2kudHlwZSA9ICJwZXJjIikKcGFyYW1ldGVyRXN0aW1hdGVzKGNvbmRpbmRpcmVjdC5leHBsb2l0LmZpdCwgYm9vdC5jaS50eXBlID0gImJjYS5zaW1wbGUiKQpgYGAKCmBgYHtyfQpjb25kaW5kaXJlY3QuZXhwbG9pdDIgPC0gJwogICMgZGlyZWN0IGVmZmVjdAogICAgb3JnZGVodW0gfiBjKnNibG1jCiAgIyBtZWRpYXRvcgogICAgZXhwbG9pdGF0dCB+IGExKnNibG1jICsgYTIqc29lYyArIGEzKnNibG1jeHNvZWMKICAgIG9yZ2RlaHVtIH4gYipleHBsb2l0YXR0CiAgIyBpbmRpcmVjdCBlZmZlY3QgKGluZGV4IG9mIG1vZGVyYXRlZCBtZWRpYXRpb24pCiAgICBhYiA6PSBhMypiCiAgIyB0b3RhbCBlZmZlY3QKICAgIHRvdGFsIDo9IGMgKyAoYTEgKyBhMiArIGEzKSpiCgogICMgbWVhbiBvZiBjZW50ZXJlZCBTT0UgKGZvciBzaW1wbGUgc2xvcGVzKQogICAgc29lYyB+IHNvZWMubWVhbioxCiAgIyB2YXJpYW5jZSBvZiBjZW50ZXJlZCBTT0UgKGZvciBzaW1wbGUgc2xvcGVzKQogICAgc29lYyB+fiBzb2VjLnZhcipzb2VjCiAgIyBpbmRpcmVjdCBlZmZlY3RzIGNvbmRpdGlvbmFsIG9uIG1vZGVyYXRvciAoYTEgKyBhMyphMi52YWx1ZSkqYgogICAgaW5kaXJlY3QuU0RiZWxvdyA6PSBhMSpiICsgYTMqYiooLXNxcnQoc29lYy52YXIpKQogICAgaW5kaXJlY3QubWVhbiA6PSBhMSpiICsgYTMqc29lYy5tZWFuKmIKICAgIGluZGlyZWN0LlNEYWJvdmUgOj0gYTEqYiArIGEzKmIqKHNxcnQoc29lYy52YXIpKQonCiAKY29uZGluZGlyZWN0LmV4cGxvaXQuZml0MiA8LSBzZW0oY29uZGluZGlyZWN0LmV4cGxvaXQyLCBkYXRhID0gZGF0LCBzZSA9ICJib290IiwgYm9vdHN0cmFwID0gMTAwMDAsIG1lYW5zdHJ1Y3R1cmUgPSBUUlVFKQpwYXJhbWV0ZXJFc3RpbWF0ZXMoY29uZGluZGlyZWN0LmV4cGxvaXQuZml0MiwgYm9vdC5jaS50eXBlID0gInBlcmMiKQpwYXJhbWV0ZXJFc3RpbWF0ZXMoY29uZGluZGlyZWN0LmV4cGxvaXQuZml0MiwgYm9vdC5jaS50eXBlID0gImJjYS5zaW1wbGUiKQpgYGAKCgpgYGB7cn0Kc3VtbWFyeShjb25kaW5kaXJlY3QuZXhwbG9pdC5maXQsIHN0YW5kYXJkaXplZCA9IEZBTFNFKQpgYGAKCmBgYHtyfQppbnNwZWN0KGNvbmRpbmRpcmVjdC5leHBsb2l0LmZpdCwgInJzcXVhcmUiKQpgYGAKCkNhbGN1bGF0aW5nIEYKYGBge3J9CmRmMSA8LSBrIDwtICBsZW5ndGgoYygiYiIsICJjIikpCm4gPC0gbm9icyhjb25kaW5kaXJlY3QuZXhwbG9pdC5maXQpCmRmMiA8LSBuIC0gawpyMiA8LSBpbnNwZWN0KGNvbmRpbmRpcmVjdC5leHBsb2l0LmZpdCwgInJzcXVhcmUiKVtbMV1dCmZzdGF0IDwtIChyMi8oMS1yMikpKihkZjIvZGYxKSAjIEYtc3RhdGlzdGljCgpkYXRhLmZyYW1lKCJGLXN0YXRpc3RpYyIgPSBmc3RhdCwgImRmMSIgPSBkZjEsICJkZjIiID0gZGYyKQpgYGAKCiMjIyMgUHJvYmluZyB0aGUgQ29uZGl0aW9uYWwgSW5kaXJlY3QgRWZmZWN0CmBgYHtyfQp3IDwtIGMoLXNkKGRhdCRzb2VjKSwgMCwgK3NkKGRhdCRzb2VjKSkKYTEgPC0gY29lZihjb25kaW5kaXJlY3QuZXhwbG9pdC5maXQpW1siYTEiXV0KYTMgPC0gY29lZihjb25kaW5kaXJlY3QuZXhwbG9pdC5maXQpW1siYTMiXV0KYiA8LSBjb2VmKGNvbmRpbmRpcmVjdC5leHBsb2l0LmZpdClbWyJiIl1dCmNvbmRpbmRpcmVjdC5wcm9iZSA8LSBkYXRhLmZyYW1lKHcsIGExLCBhMywgYikKCmNvbmRpbmRpcmVjdC5wcm9iZSAlPiUKICByb3d3aXNlKCkgJT4lCiAgbXV0YXRlKHRoZXRheG0gPSBhMSArIGEzKncpICU+JQogIG11dGF0ZShpbmRpcmVjdCA9IHRoZXRheG0qYikKYGBgCgpSZXN1bHRzIGFwcGVhciB0byBtYXRjaCB0aGUgb25lcyBhYm92ZS4KCj4gYTNiIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGNvbmRpdGlvbmFsIGluZGlyZWN0IGVmZmVjdHMgYmV0d2VlbiBncm91cHMgb2YgcGVvcGxlIHRoYXQgZGlmZmVyIGJ5IG9uZSB1bml0IGluIHRoZSBtb2RlcmF0b3IgKEhheWVzLCAyMDE3LCBwLiA0NTMpCgpgYGB7cn0Kc3VtbWFyeShsbSh3YmF0dCB+IHNibG1jKnNvZWMsIGRhdGEgPSBkYXQpKQpgYGAKCmBgYHtyfQpjb25kaW5kaXJlY3Qud2IgPC0gJwogICMgZGlyZWN0IGVmZmVjdAogICAgb3JnZGVodW0gfiBjKnNibG1jCiAgIyBtZWRpYXRvcgogICAgd2JhdHQgfiBhMSpzYmxtYyArIGEyKnNvZWMgKyBhMypzYmxtY3hzb2VjCiAgICBvcmdkZWh1bSB+IGIqd2JhdHQKICAjIGluZGlyZWN0IGVmZmVjdCAoaW5kZXggb2YgbW9kZXJhdGVkIG1lZGlhdGlvbikKICAgIGFiIDo9IGEzKmIKICAjIHRvdGFsIGVmZmVjdAogICAgdG90YWwgOj0gYyArIChhMSArIGEyICsgYTMpKmIKJwogICAgCmNvbmRpbmRpcmVjdC53Yi5maXQgPC0gc2VtKGNvbmRpbmRpcmVjdC53YiwgZGF0YSA9IGRhdCwgc2UgPSAiYm9vdCIsIGJvb3RzdHJhcCA9IDEwMDAwLCBtZWFuc3RydWN0dXJlID0gVFJVRSkKcGFyYW1ldGVyRXN0aW1hdGVzKGNvbmRpbmRpcmVjdC53Yi5maXQsIGJvb3QuY2kudHlwZSA9ICJwZXJjIikKcGFyYW1ldGVyRXN0aW1hdGVzKGNvbmRpbmRpcmVjdC53Yi5maXQsIGJvb3QuY2kudHlwZSA9ICJiY2Euc2ltcGxlIikKYGBgCgpgYGB7cn0Kc3VtbWFyeShjb25kaW5kaXJlY3Qud2IuZml0LCBzdGFuZGFyZGl6ZWQgPSBGQUxTRSkKYGBgCgoKYGBge3J9Cmluc3BlY3QoY29uZGluZGlyZWN0LndiLmZpdCwgInJzcXVhcmUiKQpgYGAKCkNhbGN1bGF0aW5nIEYKYGBge3J9CmRmMSA8LSBrIDwtICBsZW5ndGgoYygiYiIsICJjIikpCm4gPC0gbm9icyhjb25kaW5kaXJlY3Qud2IuZml0KQpkZjIgPC0gbiAtIGsKcjIgPC0gaW5zcGVjdChjb25kaW5kaXJlY3Qud2IuZml0LCAicnNxdWFyZSIpW1sxXV0KZnN0YXQgPC0gKHIyLygxLXIyKSkqKGRmMi9kZjEpICMgRi1zdGF0aXN0aWMKCmRhdGEuZnJhbWUoIkYtc3RhdGlzdGljIiA9IGZzdGF0LCAiZGYxIiA9IGRmMSwgImRmMiIgPSBkZjIpCmBgYAoKSHlwb3RoZXNpcyA3IGlzIHBhcnRpYWxseSBzdXBwb3J0ZWQuCgoqIFN1cHBvcnRlZCBmb3Igb3JnYW5pemF0aW9uLWNlbnRyaWMgYXR0cmlidXRpb25zLiBOb3RlOiBlZmZlY3QgaXMgcXVpdGUgc21hbGwuCgoqIE5vdCBzdXBwb3J0ZWQgZm9yIGVtcGxveWVlLWNlbnRyaWMgYXR0cmlidXRpb25zLgoKIyMgSHlwb3RoZXNpcyA4Cgo+IE9yZ2FuaXphdGlvbmFsIGRlaHVtYW5pemF0aW9uIGlzIG5lZ2F0aXZlbHkgcmVsYXRlZCB0byBqb2Igc2F0aXNmYWN0aW9uLgoKYGBge3J9CmNvci50ZXN0KGRhdCRvcmdkZWh1bSwgZGF0JGpvYnNhdCwgbWV0aG9kID0gInBlYXJzb24iKQpgYGAKCkh5cG90aGVzaXMgOCBpcyBzdXBwb3J0ZWQuCgpgYGB7cn0KZGF0ICU+JQogIGdncGxvdChhZXMoeCA9IG9yZ2RlaHVtLCB5ID0gam9ic2F0KSkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArCiAgc2NhbGVfeF9jb250aW51b3VzKCJPcmdhbml6YXRpb25hbCBEZWh1bWFuaXphdGlvbiIsIGJyZWFrcyA9IGMoMTo3KSkgKwogIHNjYWxlX3lfY29udGludW91cygiSm9iIFNhdGlzZmFjdGlvbiIsIGJyZWFrcyA9IGMoMTo3KSkKYGBgCgpgYGB7cn0KY29yLnRlc3QoZGF0JG9yZ2RlaHVtLCBkYXQkam9ic2F0LCBtZXRob2QgPSAia2VuZGFsbCIpCmBgYAoKYGBge3J9CnBsb3QobG0oam9ic2F0IH4gb3JnZGVodW0sIGRhdGEgPSBkYXQpKQpgYGAKCkRpYWdub3N0aWMgcGxvdHMgZ2VuZXJhbGx5IGxvb2tzIGZpbmUsIGFsdGhvdWdoIHRoZSBzY2FsZS1sb2NhdGlvbiBwbG90IGluZGljYXRlcyBzbGlnaHQgaGV0ZXJvc2NlZGFzdGljaXR5LgoKIyMgSHlwb3RoZXNpcyA5Cgo+IE9yZ2FuaXphdGlvbmFsIGRlaHVtYW5pemF0aW9uIGlzIG5lZ2F0aXZlbHkgcmVsYXRlZCB0byBhZmZlY3RpdmUgY29tbWl0bWVudC4KCmBgYHtyfQpjb3IudGVzdChkYXQkb3JnZGVodW0sIGRhdCRhY29tbWl0LCBtZXRob2QgPSAicGVhcnNvbiIpCmBgYAoKSHlwb3RoZXNpcyA5IGlzIHN1cHBvcnRlZC4KCmBgYHtyfQpkYXQgJT4lCiAgZ2dwbG90KGFlcyh4ID0gb3JnZGVodW0sIHkgPSBhY29tbWl0KSkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArCiAgc2NhbGVfeF9jb250aW51b3VzKCJPcmdhbml6YXRpb25hbCBEZWh1bWFuaXphdGlvbiIsIGJyZWFrcyA9IGMoMTo3KSkgKwogIHNjYWxlX3lfY29udGludW91cygiQWZmZWN0aXZlIENvbW1pdG1lbnQiLCBicmVha3MgPSBjKDE6NykpCmBgYAoKYGBge3J9CmNvci50ZXN0KGRhdCRvcmdkZWh1bSwgZGF0JGFjb21taXQsIG1ldGhvZCA9ICJrZW5kYWxsIikKYGBgCgpgYGB7cn0KcGxvdChsbShhY29tbWl0IH4gb3JnZGVodW0sIGRhdGEgPSBkYXQpKQpgYGAKCgojIyBIeXBvdGhlc2lzIDEwCgo+IE9yZ2FuaXphdGlvbmFsIGRlaHVtYW5pemF0aW9uIGlzIHBvc2l0aXZlbHkgcmVsYXRlZCB0byB0dXJub3ZlciBpbnRlbnRpb25zLgoKYGBge3J9CmNvci50ZXN0KGRhdCRvcmdkZWh1bSwgZGF0JHRvaW50ZW50LCBtZXRob2QgPSAicGVhcnNvbiIpCmBgYAoKSHlwb3RoZXNpcyAxMCBpcyBzdXBwb3J0ZWQuCgpgYGB7cn0KZGF0ICU+JQogIGdncGxvdChhZXMoeCA9IG9yZ2RlaHVtLCB5ID0gdG9pbnRlbnQpKSArIGdlb21fcG9pbnQoKSArIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoIk9yZ2FuaXphdGlvbmFsIERlaHVtYW5pemF0aW9uIiwgYnJlYWtzID0gYygxOjcpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKCJUdXJub3ZlciBJbnRlbnRpb25zIiwgYnJlYWtzID0gYygxOjcpKQpgYGAKCmBgYHtyfQpjb3IudGVzdChkYXQkb3JnZGVodW0sIGRhdCR0b2ludGVudCwgbWV0aG9kID0gImtlbmRhbGwiKQpgYGAKCmBgYHtyfQpwbG90KGxtKHRvaW50ZW50IH4gb3JnZGVodW0sIGRhdGEgPSBkYXQpKQpgYGAKCgojIyBIeXBvdGhlc2lzIDExCgo+IE9yZ2FuaXphdGlvbmFsIGRlaHVtYW5pemF0aW9uIGlzIHBvc2l0aXZlbHkgcmVsYXRlZCB0byBidXJub3V0LgoKYGBge3J9CmNvci50ZXN0KGRhdCRvcmdkZWh1bSwgZGF0JGJ1cm5vdXQsIG1ldGhvZCA9ICJwZWFyc29uIikKYGBgCgpIeXBvdGhlc2lzIDExIGlzIHN1cHBvcnRlZC4KCmBgYHtyfQpkYXQgJT4lCiAgZ2dwbG90KGFlcyh4ID0gb3JnZGVodW0sIHkgPSBidXJub3V0KSkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArCiAgc2NhbGVfeF9jb250aW51b3VzKCJPcmdhbml6YXRpb25hbCBEZWh1bWFuaXphdGlvbiIsIGJyZWFrcyA9IGMoMTo3KSkgKwogIHNjYWxlX3lfY29udGludW91cygiQnVybm91dCIsIGJyZWFrcyA9IGMoMTo3KSkKYGBgCgpgYGB7cn0KY29yLnRlc3QoZGF0JG9yZ2RlaHVtLCBkYXQkYnVybm91dCwgbWV0aG9kID0gImtlbmRhbGwiKQpgYGAKCmBgYHtyfQpwbG90KGxtKGJ1cm5vdXQgfiBvcmdkZWh1bSwgZGF0YSA9IGRhdCkpCmBgYAoKIyMjIEJ1cm5vdXQgRGltZW5zaW9ucwoKYGBge3J9CmNvci50ZXN0KGRhdCRvcmdkZWh1bSwgZGF0JGRpc2VuZywgbWV0aG9kID0gInBlYXJzb24iKQpjb3IudGVzdChkYXQkb3JnZGVodW0sIGRhdCRleGhhdXN0LCBtZXRob2QgPSAicGVhcnNvbiIpCmBgYAoKIyMgSHlwb3RoZXNpcyAxMgoKPiBPcmdhbml6YXRpb25hbCBkZWh1bWFuaXphdGlvbiBpcyBuZWdhdGl2ZWx5IHJlbGF0ZWQgdG8gdGFzayBwZXJmb3JtYW5jZS4KCmBgYHtyfQpjb3IudGVzdChkYXQkb3JnZGVodW0sIGRhdCRwZXJmLCBtZXRob2QgPSAicGVhcnNvbiIpCmBgYAoKSHlwb3RoZXNpcyAxMiBpcyBzdXBwb3J0ZWQuCgpgYGB7cn0KZGF0ICU+JQogIGdncGxvdChhZXMoeCA9IG9yZ2RlaHVtLCB5ID0gcGVyZikpICsgZ2VvbV9wb2ludCgpICsgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKwogIHNjYWxlX3hfY29udGludW91cygiT3JnYW5pemF0aW9uYWwgRGVodW1hbml6YXRpb24iLCBicmVha3MgPSBjKDE6NykpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoIlRhc2sgUGVyZm9ybWFuY2UiLCBicmVha3MgPSBjKDE6NykpCmBgYAoKSG93ZXZlciwgdGhlIHNjYXR0ZXJwbG90IGluZGljYXRlcyB0aGUgdmFyaWFibGVzIGRvIG5vdCBoYXZlIGEgYml2YXJpYXRlIG5vcm1hbCBkaXN0cmlidXRpb24uCgpgYGB7cn0KY29yLnRlc3QoZGF0JG9yZ2RlaHVtLCBkYXQkcGVyZiwgbWV0aG9kID0gImtlbmRhbGwiKQpgYGAKCmBgYHtyfQpwbG90KGxtKHBlcmYgfiBvcmdkZWh1bSwgZGF0YSA9IGRhdCkpCmBgYAoKUS1RIHBsb3QgaW5kaWNhdGVzIG5vbi1ub3JtYWxpdHkgb2YgcmVzaWR1YWxzLgoKIyMgSHlwb3RoZXNpcyAxMwoKPiBPcmdhbml6YXRpb25hbCBkZWh1bWFuaXphdGlvbiBpcyBuZWdhdGl2ZWx5IHJlbGF0ZWQgdG8gb3JnYW5pemF0aW9uYWwgY2l0aXplbnNoaXAgYmVoYXZpb3JzLgoKYGBge3J9CmNvci50ZXN0KGRhdCRvcmdkZWh1bSwgZGF0JG9jYiwgbWV0aG9kID0gInBlYXJzb24iKQpgYGAKCkh5cG90aGVzaXMgMTMgaXMgbm90IHN1cHBvcnRlZC4KCmBgYHtyfQpkYXQgJT4lCiAgZ2dwbG90KGFlcyh4ID0gb3JnZGVodW0sIHkgPSBvY2IpKSArIGdlb21fcG9pbnQoKSArIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoIk9yZ2FuaXphdGlvbmFsIERlaHVtYW5pemF0aW9uIiwgYnJlYWtzID0gYygxOjcpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKCJPcmdhbml6YWl0b25hbCBDaXRpemVuc2hpcCBCZWhhdmlvcnMiLCBicmVha3MgPSBjKDE6NykpCmBgYAoKYGBge3J9CmNvci50ZXN0KGRhdCRvcmdkZWh1bSwgZGF0JG9jYiwgbWV0aG9kID0gImtlbmRhbGwiKQpgYGAKCmBgYHtyfQpwbG90KGxtKG9jYiB+IG9yZ2RlaHVtLCBkYXRhID0gZGF0KSkKYGBgCgojIyBIeXBvdGhlc2lzIDE0Cgo+IE9yZ2FuaXphdGlvbmFsIGRlaHVtYW5pemF0aW9uIGlzIHBvc2l0aXZlbHkgcmVsYXRlZCB0byBjb3VudGVycHJvZHVjdGl2ZSB3b3JrIGJlaGF2aW9ycy4KCmBgYHtyfQpjb3IudGVzdChkYXQkb3JnZGVodW0sIGRhdCRjd2IsIG1ldGhvZCA9ICJwZWFyc29uIikKYGBgCgpIeXBvdGhlc2lzIDE0IGlzIHN1cHBvcnRlZC4KCmBgYHtyfQpkYXQgJT4lCiAgZ2dwbG90KGFlcyh4ID0gb3JnZGVodW0sIHkgPSBjd2IpKSArIGdlb21fcG9pbnQoKSArIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoIk9yZ2FuaXphdGlvbmFsIERlaHVtYW5pemF0aW9uIiwgYnJlYWtzID0gYygxOjcpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKCJDb3VudGVycHJvZHVjdGl2ZSBXb3JrIEJlaGF2aW9ycyIsIGJyZWFrcyA9IGMoMTo3KSkKYGBgCgpgYGB7cn0KY29yLnRlc3QoZGF0JG9yZ2RlaHVtLCBkYXQkY3diLCBtZXRob2QgPSAia2VuZGFsbCIpCmBgYAoKYGBge3J9CnBsb3QobG0oY3diIH4gb3JnZGVodW0sIGRhdGEgPSBkYXQpKQpgYGAKCioqKioKCiMgUmVncmVzc2lvbnMgd2l0aCBDb250cm9scwoKKiBCb2xzdGVyIGNvcnJlbGF0aW9uIHJlc3VsdHMgd2l0aCByZWdyZXNzaW9uIGFuYWx5c2VzIGluY2x1ZGluZyBjb250cm9sIHZhcmlhYmxlcwoqIEluY2x1ZGUgZGVtb2dyYXBoaWMgdmFyaWFibGVzIHRoYXQgd2VyZSBzaWduaWZpY2FudGx5IGNvcnJlbGF0ZSB3aXRoIGZvY2FsIHZhcmlhYmxlczoKICAgIC0gb3JndHlwZQogICAgLSBvcmdsZXZlbHMKICAgIC0gZWR1CiAgICAtIGRpcnJlcG9ydAogICAgLSBzYWxhcnkKICAgIAojIyBIeXBvdGhlc2lzIDEKYGBge3J9Cm1vZDEgPC0gbG0ob3JnZGVodW0gfiB3YmF0dCArIG9yZ3R5cGUgKyBvcmdsZXZlbHMgKyBlZHUgKyBkaXJyZXBvcnQgKyBzYWxhcnkgKyBocnByYWN0aWNlcywgZGF0YSA9IGRhdCkKc3VtbWFyeShtb2QxKQpgYGAKCmBgYHtyfQptb2QyIDwtIGxtKG9yZ2RlaHVtIH4gZXhwbG9pdGF0dCArIG9yZ3R5cGUgKyBvcmdsZXZlbHMgKyBlZHUgKyBkaXJyZXBvcnQgKyBzYWxhcnkgKyBocnByYWN0aWNlcywgZGF0YSA9IGRhdCkKc3VtbWFyeShtb2QyKQpgYGAKCiMjIEh5cG90aGVzaXMgMgpgYGB7cn0KbW9kMyA8LSBsbShvcmdkZWh1bSB+IHNibG0gKyBvcmd0eXBlICsgb3JnbGV2ZWxzICsgZWR1ICsgZGlycmVwb3J0ICsgc2FsYXJ5ICsgaHJwcmFjdGljZXMsIGRhdGEgPSBkYXQpCnN1bW1hcnkobW9kMykKYGBgCgojIyBIeXBvdGhlc2lzIDMKYGBge3J9Cm1vZDQgPC0gbG0oZXhwbG9pdGF0dCB+IHNibG0gKyBvcmd0eXBlICsgb3JnbGV2ZWxzICsgZWR1ICsgZGlycmVwb3J0ICsgc2FsYXJ5ICsgaHJwcmFjdGljZXMsIGRhdGEgPSBkYXQpCnN1bW1hcnkobW9kNCkKYGBgCgpgYGB7cn0KbW9kNSA8LSBsbSh3YmF0dCB+IHNibG0gKyBvcmd0eXBlICsgb3JnbGV2ZWxzICsgZWR1ICsgZGlycmVwb3J0ICsgc2FsYXJ5ICsgaHJwcmFjdGljZXMsIGRhdGEgPSBkYXQpCnN1bW1hcnkobW9kNSkKYGBgCgojIyBBbGwgUHJlZGljdG9ycwpgYGB7cn0KbW9kNiA8LSBsbShvcmdkZWh1bSB+IHNibG0gKyBleHBsb2l0YXR0ICsgd2JhdHQgKyBvcmd0eXBlICsgb3JnbGV2ZWxzICsgZWR1ICsgZGlycmVwb3J0ICsgc2FsYXJ5ICsgaHJwcmFjdGljZXMsIGRhdGEgPSBkYXQpCnN1bW1hcnkobW9kNikKYGBgCgpSZWdyZXNzaW9uIGFuYWx5c2VzIGluZGljYXRlIHRoYXQgcHJlZGljdG9ycyBvZiBpbnRlcmVzdCBwcmVkaWN0IG9yZ2FuemF0aW9uYWwgZGVodW1hbml6YXRpb24gZXZlbiBhZnRlciBjb250cm9sbGluZyBmb3IgY292YXJpYXRlcyBhbmQgZWFjaCBvdGhlci4KCioqKioKCiMgU3VwcGxlbWVudGFsIEFuYWx5c2VzOiBDRkEgb2YgQ29yZSBDb25zdHJ1Y3RzCiMjIFNpbmdsZSBGYWN0b3IKYGBge3J9CmNmYS5tb2RlbCA8LSAnCiAgIyBtZWFzdXJlbWVudCBtb2RlbAogICAgZmFjdG9yID1+IHNibG1fMSArIHNibG1fMiArIHNibG1fMyArIHNibG1fNCArIGV4cGxvaXRfMSArIGV4cGxvaXRfMiArIGV4cGxvaXRfMyArIHdiYXR0XzEgKyB3YmF0dF8yICsgd2JhdHRfMyArIG9yZ2RlaHVtXzEgKyBvcmdkZWh1bV8yICsgb3JnZGVodW1fMyArIG9yZ2RlaHVtXzQgKyBvcmdkZWh1bV81ICsgb3JnZGVodW1fNiArIG9yZ2RlaHVtXzcgKyBvcmdkZWh1bV84ICsgb3JnZGVodW1fOSArIG9yZ2RlaHVtXzEwICsgb3JnZGVodW1fMTEKJwpjZmEuZml0IDwtIGNmYShjZmEubW9kZWwsIGRhdGEgPSBkYXQpCnN1bW1hcnkoY2ZhLmZpdCwgZml0Lm1lYXN1cmVzID0gVFJVRSwgc3RhbmRhcmRpemVkID0gVFJVRSkKYGBgCgoqIFBvb3IgZml0CgpgYGB7cn0KbGlicmFyeShzZW1QbG90KQpzZW1QYXRocyhjZmEuZml0LCB3aGF0ID0gInBhdGhzIiwgd2hhdExhYmVscyA9ICJzdGQiKQpgYGAKCiMjIFR3byBGYWN0b3IKYGBge3J9CmNmYS5tb2RlbCA8LSAnCiAgIyBtZWFzdXJlbWVudCBtb2RlbAogICAgZmFjdG9yMSA9fiBzYmxtXzEgKyBzYmxtXzIgKyBzYmxtXzMgKyBzYmxtXzQgKyBleHBsb2l0XzEgKyBleHBsb2l0XzIgKyBleHBsb2l0XzMgKyBvcmdkZWh1bV8xICsgb3JnZGVodW1fMiArIG9yZ2RlaHVtXzMgKyBvcmdkZWh1bV80ICsgb3JnZGVodW1fNSArIG9yZ2RlaHVtXzYgKyBvcmdkZWh1bV83ICsgb3JnZGVodW1fOCArIG9yZ2RlaHVtXzkgKyBvcmdkZWh1bV8xMCArIG9yZ2RlaHVtXzExCiAgICBmYWN0b3IyID1+IHdiYXR0XzEgKyB3YmF0dF8yICsgd2JhdHRfMwonCmNmYS5maXQgPC0gY2ZhKGNmYS5tb2RlbCwgZGF0YSA9IGRhdCwgZXN0aW1hdG9yID0gIk1MUiIpCnN1bW1hcnkoY2ZhLmZpdCwgZml0Lm1lYXN1cmVzID0gVFJVRSwgc3RhbmRhcmRpemVkID0gVFJVRSkKYGBgCgoqIFBvb3IgZml0CgpgYGB7cn0Kc2VtUGF0aHMoY2ZhLmZpdCwgd2hhdCA9ICJwYXRocyIsIHdoYXRMYWJlbHMgPSAic3RkIikKYGBgCgojIyBGaXJzdCBPcmRlciBGYWN0b3JzCmBgYHtyfQpjZmEubW9kZWwgPC0gJwogICMgbWVhc3VyZW1lbnQgbW9kZWwKICAgIGJsbSA9fiBzYmxtXzEgKyBzYmxtXzIgKyBzYmxtXzMgKyBzYmxtXzQKICAgIGV4cGxvaXQgPX4gZXhwbG9pdF8xICsgZXhwbG9pdF8yICsgZXhwbG9pdF8zCiAgICB3YiA9fiB3YmF0dF8xICsgd2JhdHRfMiArIHdiYXR0XzMKICAgIG9kaCA9fiBvcmdkZWh1bV8xICsgb3JnZGVodW1fMiArIG9yZ2RlaHVtXzMgKyBvcmdkZWh1bV80ICsgb3JnZGVodW1fNSArIG9yZ2RlaHVtXzYgKyBvcmdkZWh1bV83ICsgb3JnZGVodW1fOCArIG9yZ2RlaHVtXzkgKyBvcmdkZWh1bV8xMCArIG9yZ2RlaHVtXzExCicKY2ZhLmZpdCA8LSBjZmEoY2ZhLm1vZGVsLCBkYXRhID0gZGF0LCBlc3RpbWF0b3IgPSAiTUxSIikKc3VtbWFyeShjZmEuZml0LCBmaXQubWVhc3VyZXMgPSBUUlVFLCBzdGFuZGFyZGl6ZWQgPSBUUlVFKQpgYGAKCgpgYGB7cn0Kc2VtUGF0aHMoY2ZhLmZpdCwgd2hhdCA9ICJwYXRocyIsIHdoYXRMYWJlbHMgPSAic3RkIikKYGBgCgoqIEJldHRlciBGaXQKCioqKioKCiMgU3VwcGxlbWVudGEgQW5hbHlzZXM6IFByb2JsaW5nIHRoZSBDb25kaXRpb25hbCBJbmRpcmVjdCBFZmZlY3QKCmBgYHtyfQpsaWJyYXJ5KGxhdmFhbikKCiMgTmVlZCB0byBtYW51YWxseSBjcmVhdGUgaW50ZXJhY3Rpb24gdGVybQpkYXQgJTw+JQogIG11dGF0ZShzYmxteHNvZSA9IHNibG0qc29lKSAlPiUgIyBVbmNlbnRlcmVkCiAgbXV0YXRlKHNibG1jeHNvZWMgPSBzYmxtYypzb2VjKSAjIENlbnRlcmVkCmBgYAoKIyMgQ29uZGl0aW9uYWwgSW5kaXJlY3QgRWZmZWN0IFRocm91Z2ggRXhwbG9pdApgYGB7cn0KY29uZGluZGlyZWN0LmV4cGxvaXQgPC0gJwogICMgZGlyZWN0IGVmZmVjdAogICAgb3JnZGVodW0gfiBjKnNibG1jCiAgIyBtZWRpYXRvcgogICAgZXhwbG9pdGF0dGMgfiBhMSpzYmxtYyArIGEyKnNvZWMgKyBhMypzYmxtY3hzb2VjCiAgICBvcmdkZWh1bSB+IGIqZXhwbG9pdGF0dGMKICAjIGluZGlyZWN0IGVmZmVjdCAoaW5kZXggb2YgbW9kZXJhdGVkIG1lZGlhdGlvbikKICAgIGFiIDo9IGEzKmIKICAjIHRvdGFsIGVmZmVjdAogICAgdG90YWwgOj0gYyArIChhMSArIGEyICsgYTMpKmIKICAjIG1lYW4gb2YgY2VudGVyZWQgU09FIChmb3Igc2ltcGxlIHNsb3BlcykKICAgIHNvZWMgfiBzb2VjLm1lYW4qMQogICMgdmFyaWFuY2Ugb2YgY2VudGVyZWQgU09FIChmb3Igc2ltcGxlIHNsb3BlcykKICAgIHNvZWMgfn4gc29lYy52YXIqc29lYwogICMgaW5kaXJlY3QgZWZmZWN0cyBjb25kaXRpb25hbCBvbiBtb2RlcmF0b3IgKGExICsgYTMqYTIudmFsdWUpKmIKICAgIGluZGlyZWN0LlNEYmVsb3cgOj0gYTEqYiArIGEzKmIqLXNxcnQoc29lYy52YXIpCiAgICBpbmRpcmVjdC5tZWFuIDo9IGExKmIgKyBhMypzb2VjLm1lYW4qYgogICAgaW5kaXJlY3QuU0RhYm92ZSA6PSBhMSpiICsgYTMqYipzcXJ0KHNvZWMudmFyKQonCiAgICAKY29uZGluZGlyZWN0LmV4cGxvaXQuZml0IDwtIHNlbShjb25kaW5kaXJlY3QuZXhwbG9pdCwgZGF0YSA9IGRhdCwgc2UgPSAiYm9vdCIsIGJvb3RzdHJhcCA9IDEwMDAwKQpwYXJhbWV0ZXJFc3RpbWF0ZXMoY29uZGluZGlyZWN0LmV4cGxvaXQuZml0LCBib290LmNpLnR5cGUgPSAiYmNhLnNpbXBsZSIpCmBgYAoKCiMjIENvbmRpdGlvbmFsIEluZGlyZWN0IEVmZmVjdCBUaHJvdWdoIFdCCmBgYHtyfQpjb25kaW5kaXJlY3Qud2IgPC0gJwogICMgZGlyZWN0IGVmZmVjdAogICAgb3JnZGVodW0gfiBjKnNibG1jCiAgIyBtZWRpYXRvcgogICAgd2JhdHRjIH4gYTEqc2JsbWMgKyBhMipzb2VjICsgYTMqc2JsbWN4c29lYwogICAgb3JnZGVodW0gfiBiKndiYXR0YwogICMgaW5kaXJlY3QgZWZmZWN0IChpbmRleCBvZiBtb2RlcmF0ZWQgbWVkaWF0aW9uKQogICAgYWIgOj0gYTMqYgogICMgdG90YWwgZWZmZWN0CiAgICB0b3RhbCA6PSBjICsgKGExICsgYTIgKyBhMykqYgogICMgbWVhbiBvZiBjZW50ZXJlZCBTT0UgKGZvciBzaW1wbGUgc2xvcGVzKQogICAgc29lYyB+IHNvZWMubWVhbioxCiAgIyB2YXJpYW5jZSBvZiBjZW50ZXJlZCBTT0UgKGZvciBzaW1wbGUgc2xvcGVzKQogICAgc29lYyB+fiBzb2VjLnZhcipzb2VjCiAgIyBpbmRpcmVjdCBlZmZlY3RzIGNvbmRpdGlvbmFsIG9uIG1vZGVyYXRvciAoYTEgKyBhMyphMi52YWx1ZSkqYgogICAgaW5kaXJlY3QuU0RiZWxvdyA6PSBhMSpiICsgYTMqYiotc3FydChzb2VjLnZhcikKICAgIGluZGlyZWN0Lm1lYW4gOj0gYTEqYiArIGEzKnNvZWMubWVhbipiCiAgICBpbmRpcmVjdC5TRGFib3ZlIDo9IGExKmIgKyBhMypiKnNxcnQoc29lYy52YXIpCicKICAgIApjb25kaW5kaXJlY3Qud2IuZml0IDwtIHNlbShjb25kaW5kaXJlY3Qud2IsIGRhdGEgPSBkYXQsIHNlID0gImJvb3QiLCBib290c3RyYXAgPSAxMDAwMCkKcGFyYW1ldGVyRXN0aW1hdGVzKGNvbmRpbmRpcmVjdC53Yi5maXQsIGJvb3QuY2kudHlwZSA9ICJiY2Euc2ltcGxlIikKYGBgCgoKIyBTdXBwbGVtZW50YWwgQW5hbHlzZXM6IFNPRSBNb2RlcmF0aW5nIERpcmVjdCBQYXRoCgpgYGB7cn0KY29uZGluZGlyZWN0LmV4cGxvaXQyIDwtICcKICAjIGRpcmVjdCBlZmZlY3QKICAgIG9yZ2RlaHVtIH4gYzEqc2JsbWMgKyBjMipzb2VjICsgYzMqc2JsbWN4c29lYwogICMgbWVkaWF0b3IKICAgIGV4cGxvaXRhdHQgfiBhMSpzYmxtYyArIGEyKnNvZWMgKyBhMypzYmxtY3hzb2VjCiAgICBvcmdkZWh1bSB+IGIqZXhwbG9pdGF0dAogICMgaW5kaXJlY3QgZWZmZWN0IChpbmRleCBvZiBtb2RlcmF0ZWQgbWVkaWF0aW9uKQogICAgYWIgOj0gYTMqYgogICMgdG90YWwgZWZmZWN0CiAgICB0b3RhbCA6PSBjMSArIGMyICsgYzMgKyAoYTEgKyBhMiArIGEzKSpiCiAgIyBtZWFuIG9mIGNlbnRlcmVkIFNPRSAoZm9yIHNpbXBsZSBzbG9wZXMpCiAgICBzb2VjIH4gc29lYy5tZWFuKjEKICAjIHZhcmlhbmNlIG9mIGNlbnRlcmVkIFNPRSAoZm9yIHNpbXBsZSBzbG9wZXMpCiAgICBzb2VjIH5+IHNvZWMudmFyKnNvZWMKICAjIGluZGlyZWN0IGVmZmVjdHMgY29uZGl0aW9uYWwgb24gbW9kZXJhdG9yIChhMSArIGEzKmEyLnZhbHVlKSpiCiAgICBpbmRpcmVjdC5TRGJlbG93IDo9IGExKmIgKyBhMypiKi1zcXJ0KHNvZWMudmFyKQogICAgaW5kaXJlY3QubWVhbiA6PSBhMSpiICsgYTMqc29lYy5tZWFuKmIKICAgIGluZGlyZWN0LlNEYWJvdmUgOj0gYTEqYiArIGEzKmIqc3FydChzb2VjLnZhcikKJwogICAgCmNvbmRpbmRpcmVjdC5leHBsb2l0LmZpdDIgPC0gc2VtKGNvbmRpbmRpcmVjdC5leHBsb2l0MiwgZGF0YSA9IGRhdCwgc2UgPSAiYm9vdCIsIGJvb3RzdHJhcCA9IDEwMDAwKQpwYXJhbWV0ZXJFc3RpbWF0ZXMoY29uZGluZGlyZWN0LmV4cGxvaXQuZml0MiwgYm9vdC5jaS50eXBlID0gImJjYS5zaW1wbGUiKQpgYGAKClRoZSBib290c3RyYXBwZWQgY29uZmlkZW5jZSBpbnRlcnZhbHMgZm9yIHRoZSBpbmRleCBvZiBtb2RlcmF0ZWQgbWVkaWF0aW9uIChhMypiKSBkb2VzIG5vdCBjb250YWluIDAuIEFsc28sIHRoZSBkaXJlY3QgbW9kZXJhdGlvbiBlZmZlY3QgKGMzKSBhcHBlYXJzIHRvIGJlIHNpZ25pZmljYW50IGFzIHdlbGwuCgpgYGB7cn0KY29uZGluZGlyZWN0LndiMiA8LSAnCiAgIyBkaXJlY3QgZWZmZWN0CiAgICBvcmdkZWh1bSB+IGMxKnNibG1jICsgYzIqc29lYyArIGMzKnNibG1jeHNvZWMKICAjIG1lZGlhdG9yCiAgICB3YmF0dCB+IGExKnNibG1jICsgYTIqc29lYyArIGEzKnNibG1jeHNvZWMKICAgIG9yZ2RlaHVtIH4gYip3YmF0dAogICMgaW5kaXJlY3QgZWZmZWN0IChpbmRleCBvZiBtb2RlcmF0ZWQgbWVkaWF0aW9uKQogICAgYWIgOj0gYTMqYgogICMgdG90YWwgZWZmZWN0CiAgICB0b3RhbCA6PSBjMSArIGMyICsgYzMgKyAoYTEgKyBhMiArIGEzKSpiCiAgIyBtZWFuIG9mIGNlbnRlcmVkIFNPRSAoZm9yIHNpbXBsZSBzbG9wZXMpCiAgICBzb2VjIH4gc29lYy5tZWFuKjEKICAjIHZhcmlhbmNlIG9mIGNlbnRlcmVkIFNPRSAoZm9yIHNpbXBsZSBzbG9wZXMpCiAgICBzb2VjIH5+IHNvZWMudmFyKnNvZWMKICAjIGluZGlyZWN0IGVmZmVjdHMgY29uZGl0aW9uYWwgb24gbW9kZXJhdG9yIChhMSArIGEzKmEyLnZhbHVlKSpiCiAgICBpbmRpcmVjdC5TRGJlbG93IDo9IGExKmIgKyBhMypiKi1zcXJ0KHNvZWMudmFyKQogICAgaW5kaXJlY3QubWVhbiA6PSBhMSpiICsgYTMqc29lYy5tZWFuKmIKICAgIGluZGlyZWN0LlNEYWJvdmUgOj0gYTEqYiArIGEzKmIqc3FydChzb2VjLnZhcikKJwogICAgCmNvbmRpbmRpcmVjdC53Yi5maXQyIDwtIHNlbShjb25kaW5kaXJlY3Qud2IyLCBkYXRhID0gZGF0LCBzZSA9ICJib290IiwgYm9vdHN0cmFwID0gMTAwMDApCnBhcmFtZXRlckVzdGltYXRlcyhjb25kaW5kaXJlY3Qud2IuZml0MiwgYm9vdC5jaS50eXBlID0gImJjYS5zaW1wbGUiKQpgYGAKCioqKioKCiMgU3VwcGxlbWVudGFsIEFuYWx5c2VzOiBQYXJhbGxlbCBNZWRpYXRpb24KYGBge3J9CmluZGlyZWN0LnBhcmFsbGVsIDwtICcKICAjIGRpcmVjdCBlZmZlY3QKICAgIG9yZ2RlaHVtIH4gYypzYmxtCiAgIyBtZWRpYXRvcnMKICAgIGV4cGxvaXRhdHQgfiBhMSpzYmxtCiAgICB3YmF0dCB+IGEyKnNibG0KICAgIG9yZ2RlaHVtIH4gYjEqZXhwbG9pdGF0dCArIGIyKndiYXR0CiAgIyBpbmRpcmVjdCBlZmZlY3RzCiAgICBhMWIxIDo9IGExKmIxCiAgICBhMmIyIDo9IGEyKmIyCiAgICB0b3RhbCA6PSBhMWIxICsgYTJiMgonCgppbmRpcmVjdC5wYXJhbGxlbC5maXQgPC0gc2VtKGluZGlyZWN0LnBhcmFsbGVsLCBkYXRhID0gZGF0LCBzZSA9ICJib290IiwgYm9vdHN0cmFwID0gMTAwMDAsIG1lYW5zdHJ1Y3R1cmUgPSBUUlVFKQpwYXJhbWV0ZXJFc3RpbWF0ZXMoaW5kaXJlY3QucGFyYWxsZWwuZml0LCBib290LmNpLnR5cGUgPSAicGVyYyIpCnBhcmFtZXRlckVzdGltYXRlcyhpbmRpcmVjdC5wYXJhbGxlbC5maXQsIGJvb3QuY2kudHlwZSA9ICJiY2Euc2ltcGxlIikKc3VtbWFyeShpbmRpcmVjdC5wYXJhbGxlbC5maXQsIHN0YW5kYXJkaXplZCA9IEZBTFNFKQpgYGAKCmBgYHtyfQppbnNwZWN0KGluZGlyZWN0LnBhcmFsbGVsLmZpdCwgInJzcXVhcmUiKQpgYGAKCkNhbGN1bGF0aW5nIEYKYGBge3J9CmRmMSA8LSBrIDwtICBsZW5ndGgoYygiYjEiLCAiYjIiLCAiYyIpKQpuIDwtIG5vYnMoaW5kaXJlY3QucGFyYWxsZWwuZml0KQpkZjIgPC0gbiAtIGsKcjIgPC0gaW5zcGVjdChpbmRpcmVjdC5wYXJhbGxlbC5maXQsICJyc3F1YXJlIilbWzFdXQpmc3RhdCA8LSAocjIvKDEtcjIpKSooZGYyL2RmMSkgIyBGLXN0YXRpc3RpYwoKZGF0YS5mcmFtZSgiRi1zdGF0aXN0aWMiID0gZnN0YXQsICJkZjEiID0gZGYxLCAiZGYyIiA9IGRmMikKYGBgCgoqKioqCgojIFN1cHBsZW1lbnRhbCBBbmFseXNlczogQ29uZGl0aW9uYWwgUGFyYWxsZWwgTWVkaWF0aW9uIChhMSBtb2RlcmF0ZWQpCmBgYHtyfQpkYXQgJTw+JQogIG11dGF0ZShzYmxteHNvZSA9IHNibG0qc29lKSAlPiUgIyBVbmNlbnRlcmVkCiAgbXV0YXRlKHNibG1jeHNvZWMgPSBzYmxtYypzb2VjKSAjIENlbnRlcmVkCmBgYAoKCmBgYHtyfQpjb25kLnBhcmFsbGVsIDwtICcKICAjIGRpcmVjdCBlZmZlY3QKICAgIG9yZ2RlaHVtIH4gYypzYmxtYwogICMgbWVkaWF0b3JzCiAgICBleHBsb2l0YXR0IH4gYTEqc2JsbWMgKyBhMypzb2VjICsgYTQqc2JsbWN4c29lYwogICAgd2JhdHQgfiBhMipzYmxtYwogICAgb3JnZGVodW0gfiBiMSpleHBsb2l0YXR0ICsgYjIqd2JhdHQKICAjIGluZGlyZWN0IGVmZmVjdHMKICAgIGExYjEgOj0gYTEqYjEKICAgIGEyYjIgOj0gYTIqYjIKICAjIGluZGV4IG9mIG1vZGVyYXRlZCBtZWRpYXRpb24KICAgIGE0YjEgOj0gYTQqYjEKICAjIHRvdGFsIGluZGlyZWN0IGVmZmVjdAogICAgdG90YWwgOj0gYTFiMSArIGEyYjIKJwoKY29uZC5wYXJhbGxlbC5maXQgPC0gc2VtKGNvbmQucGFyYWxsZWwsIGRhdGEgPSBkYXQsIHNlID0gImJvb3QiLCBib290c3RyYXAgPSAxMDAwMCwgbWVhbnN0cnVjdHVyZSA9IFRSVUUpCmBgYAoKYGBge3J9CnBhcmFtZXRlckVzdGltYXRlcyhjb25kLnBhcmFsbGVsLmZpdCwgYm9vdC5jaS50eXBlID0gInBlcmMiKQpwYXJhbWV0ZXJFc3RpbWF0ZXMoY29uZC5wYXJhbGxlbC5maXQsIGJvb3QuY2kudHlwZSA9ICJiY2Euc2ltcGxlIikKc3VtbWFyeShjb25kLnBhcmFsbGVsLmZpdCwgc3RhbmRhcmRpemVkID0gRkFMU0UpCmBgYAoKYGBge3J9Cmluc3BlY3QoY29uZC5wYXJhbGxlbC5maXQsICJyc3F1YXJlIikKYGBgCgpDYWxjdWxhdGluZyBGCmBgYHtyfQpkZjEgPC0gayA8LSBsZW5ndGgoYygiYjEiLCAiYjIiLCAiYyIpKQpuIDwtIG5vYnMoY29uZC5wYXJhbGxlbC5maXQpCmRmMiA8LSBuIC0gawpyMiA8LSBpbnNwZWN0KGNvbmQucGFyYWxsZWwuZml0LCAicnNxdWFyZSIpW1sxXV0KZnN0YXQgPC0gKHIyLygxLXIyKSkqKGRmMi9kZjEpICMgRi1zdGF0aXN0aWMKCmRhdGEuZnJhbWUoIkYtc3RhdGlzdGljIiA9IGZzdGF0LCAiZGYxIiA9IGRmMSwgImRmMiIgPSBkZjIpCmBgYAoKIyMgU2ltcGxlIE1vZGVscyBmb3IgQ29lZmZpY2llbnRzCmBgYHtyfQpzdW1tYXJ5KGxtKGV4cGxvaXRhdHQgfiBzYmxtLCBkYXRhID0gZGF0KSkKYGBgCgpgYGB7cn0Kc3VtbWFyeShsbSh3YmF0dCB+IHNibG0sIGRhdGEgPSBkYXQpKQpgYGAKCiMgU3VwcGxlbWVudGFsIEFuYWx5c2VzOiBDb25kaXRpb25hbCBQYXJhbGxlbCBNZWRpYXRpb24gKGExIGFuZCBjJyBtb2RlcmF0ZWQpCmBgYHtyfQpjb25kLnBhcmFsbGVsMiA8LSAnCiAgIyBkaXJlY3QgZWZmZWN0CiAgICBvcmdkZWh1bSB+IGMqc2JsbWMKICAjIG1lZGlhdG9ycwogICAgZXhwbG9pdGF0dCB+IGExKnNibG1jICsgYTMqc29lYyArIGE0KnNibG1jeHNvZWMKICAgIHdiYXR0IH4gYTIqc2JsbWMKICAgIG9yZ2RlaHVtIH4gYjEqZXhwbG9pdGF0dCArIGIyKndiYXR0ICsgYjMqc29lYyArIGI0KnNibG1jeHNvZWMKICAjIGluZGlyZWN0IGVmZmVjdHMKICAgIGExYjEgOj0gYTEqYjEKICAgIGEyYjIgOj0gYTIqYjIKICAjIGluZGV4IG9mIG1vZGVyYXRlZCBtZWRpYXRpb24KICAgIGE0YjEgOj0gYTQqYjEKICAjIHRvdGFsIGluZGlyZWN0IGVmZmVjdAogICAgdG90YWwgOj0gYTFiMSArIGEyYjIKJwoKY29uZC5wYXJhbGxlbC5maXQyIDwtIHNlbShjb25kLnBhcmFsbGVsMiwgZGF0YSA9IGRhdCwgc2UgPSAiYm9vdCIsIGJvb3RzdHJhcCA9IDEwMDAwLCBtZWFuc3RydWN0dXJlID0gVFJVRSkKYGBgCgpgYGB7cn0KcGFyYW1ldGVyRXN0aW1hdGVzKGNvbmQucGFyYWxsZWwuZml0MiwgYm9vdC5jaS50eXBlID0gInBlcmMiKQpwYXJhbWV0ZXJFc3RpbWF0ZXMoY29uZC5wYXJhbGxlbC5maXQyLCBib290LmNpLnR5cGUgPSAiYmNhLnNpbXBsZSIpCnN1bW1hcnkoY29uZC5wYXJhbGxlbC5maXQyLCBzdGFuZGFyZGl6ZWQgPSBGQUxTRSkKYGBgCgpgYGB7cn0KaW5zcGVjdChjb25kLnBhcmFsbGVsLmZpdDIsICJyc3F1YXJlIikKYGBgCgpDYWxjdWxhdGluZyBGCmBgYHtyfQpkZjEgPC0gayA8LSBsZW5ndGgoYygiYjEiLCAiYjIiLCAiYjMiLCAiYjQiLCAiYyIpKQpuIDwtIG5vYnMoY29uZC5wYXJhbGxlbC5maXQyKQpkZjIgPC0gbiAtIGsKcjIgPC0gaW5zcGVjdChjb25kLnBhcmFsbGVsLmZpdDIsICJyc3F1YXJlIilbWzFdXQpmc3RhdCA8LSAocjIvKDEtcjIpKSooZGYyL2RmMSkgIyBGLXN0YXRpc3RpYwoKZGF0YS5mcmFtZSgiRi1zdGF0aXN0aWMiID0gZnN0YXQsICJkZjEiID0gZGYxLCAiZGYyIiA9IGRmMikKYGBgCgoqKioqCiMgU3VwcGxlbWVudGFsIEFuYWx5c2VzOiBFeGFtaW5pbmcgSFIgUHJhY3RpY2VzCgojIyBIUiBQcmFjdGljZXMgRGVzY3JpcHRpdmVzCmBgYHtyfQpkYXQgJT4lCiAgZ3JvdXBfYnkoc2VsZWN0aW9uKSAlPiUKICB0YWxseSgpCmBgYAoKRmV3IHBlb3BsZSBleHBlcmllbmNlIG5vIHNlbGVjdGlvbiBwcmFjdGljZXMgYXQgYWxsLgoKYGBge3J9CmRhdCAlPiUKICBncm91cF9ieSh0cmFpbmluZykgJT4lCiAgdGFsbHkoKQpgYGAKCmBgYHtyfQpkYXQgJT4lCiAgZ3JvdXBfYnkoYXBwcmFpc2FsKSAlPiUKICB0YWxseSgpCmBgYAoKYGBge3J9CmRhdCAlPiUKICBncm91cF9ieShjb21wZW5zYXRpb24pICU+JQogIHRhbGx5KCkKYGBgCgpgYGB7cn0KZGF0ICU+JQogIGdyb3VwX2J5KGhycHJhY3RpY2VzKSAlPiUKICB0YWxseSgpCmBgYAoKIyMgSFIgUHJhY3RpY2VzIENvcnJlbGF0aW9ucwpgYGB7cn0Kc291cmNlKCJjb3JzdGFycy5SIikKCmRhdCAlPiUKICBzZWxlY3QoaHJwcmFjdGljZXMsIHNlbGVjdGlvbjpjb21wZW5zYXRpb24sIG9yZ2RlaHVtLCBleHBsb2l0YXR0OndiYXR0LCBzYmxtLCBvcmdkZWh1bSwgcG9zKSAlPiUKICBhcy5tYXRyaXgoLikgJT4lCiAgY29yc3RhcnMoLiwgbWV0aG9kID0gInBlYXJzb24iKQpgYGAKClN1bSBvZiBIUiBwcmFjdGljZXMgZ2VuZXJhbGx5IHNlZW1zIHRvIGJlIHJlbGF0ZWQgdG8gcG9zaXRpdmUgb3V0Y29tZXMuCgojIyBIUiBQcmFjdGljZSBEZXNjcmlwdGl2ZTogU3BlY2lmaWMgSXRlbXMKYGBge3J9CmRhdCAlPiUKICBzdW1tYXJpc2VfYXQodmFycyhzZWxlY3Rpb25fMTpjb21wZW5zXzMpLCBzdW0sIG5hLnJtID0gRkFMU0UpCmBgYAoKCiMjIEhSIFByYWN0aWNlIENvcnJlbGF0aW9uczogU3BlY2lmaWMgSXRlbXMKYGBge3J9CnNvdXJjZSgiY29yc3RhcnMuUiIpCgpkYXQgJT4lCiAgc2VsZWN0KHNlbGVjdGlvbl8xOmNvbXBlbnNfMywgb3JnZGVodW0sIGV4cGxvaXRhdHQ6d2JhdHQsIHNibG0pICU+JQogIGFzLm1hdHJpeCguKSAlPiUKICBjb3JzdGFycyguLCBtZXRob2QgPSAicGVhcnNvbiIpCmBgYAoKKioqKgoKIyBTdXBwbGVtZW50YWwgQW5hbHlzZXM6IERlbW9ncmFwaGljIERpZmZlcmVuY2VzCgoqKioqCgojIyBSZWdpb24KYGBge3J9CmRhdCAlPiUKICBncm91cF9ieShyZWdpb24pICU+JQogIHRhbGx5KCkKYGBgCgoKYGBge3J9CnNvdXJjZSgic3VtbWFyeVNFLlIiKQoKZGF0ICU+JQogIHN1bW1hcnlTRSguLCBtZWFzdXJldmFyID0gIm9yZ2RlaHVtIiwgZ3JvdXB2YXJzID0gInJlZ2lvbiIsIG5hLnJtID0gVFJVRSkKYGBgCgpgYGB7cn0Kc3VtbWFyeShhb3Yob3JnZGVodW0gfiByZWdpb24sIGRhdGEgPSBkYXQpKQpgYGAKCmBgYHtyfQpzb3VyY2UoInN1bW1hcnlTRS5SIikKCmRhdCAlPiUKICBzdW1tYXJ5U0UoLiwgbWVhc3VyZXZhciA9ICJzYmxtIiwgZ3JvdXB2YXJzID0gInJlZ2lvbiIsIG5hLnJtID0gVFJVRSkKYGBgCgpgYGB7cn0Kc3VtbWFyeShhb3Yoc2JsbSB+IHJlZ2lvbiwgZGF0YSA9IGRhdCkpCmBgYAoKYGBge3J9CnNvdXJjZSgic3VtbWFyeVNFLlIiKQoKZGF0ICU+JQogIHN1bW1hcnlTRSguLCBtZWFzdXJldmFyID0gImV4cGxvaXRhdHQiLCBncm91cHZhcnMgPSAicmVnaW9uIiwgbmEucm0gPSBUUlVFKQpgYGAKCmBgYHtyfQpzdW1tYXJ5KGFvdihleHBsb2l0YXR0IH4gcmVnaW9uLCBkYXRhID0gZGF0KSkKYGBgCgpgYGB7cn0Kc291cmNlKCJzdW1tYXJ5U0UuUiIpCgpkYXQgJT4lCiAgc3VtbWFyeVNFKC4sIG1lYXN1cmV2YXIgPSAid2JhdHQiLCBncm91cHZhcnMgPSAicmVnaW9uIiwgbmEucm0gPSBUUlVFKQpgYGAKCmBgYHtyfQpzdW1tYXJ5KGFvdih3YmF0dCB+IHJlZ2lvbiwgZGF0YSA9IGRhdCkpCmBgYAoKTm8gc2lnbmlmaWNhbnQgbWVhbiBkaWZmZXJlbmNlcyBpbiB2YXJpYWJsZXMgb2YgaW50ZXJlc3QgYWNyb3NzIHJlZ2lvbnMuCgoqKioqCgojIyBJbmR1c3RyeQpgYGB7cn0Kc291cmNlKCJzdW1tYXJ5U0UuUiIpCgpkYXQgJT4lCiAgc3VtbWFyeVNFKC4sIG1lYXN1cmV2YXIgPSAib3JnZGVodW0iLCBncm91cHZhcnMgPSAiaW5kdXN0cnkiLCBuYS5ybSA9IFRSVUUpCmBgYAoKYGBge3J9CnNvdXJjZSgic3VtbWFyeVNFLlIiKQoKZGF0ICU+JQogIHN1bW1hcnlTRSguLCBtZWFzdXJldmFyID0gInNibG0iLCBncm91cHZhcnMgPSAiaW5kdXN0cnkiLCBuYS5ybSA9IFRSVUUpCmBgYAoKYGBge3J9CnNvdXJjZSgic3VtbWFyeVNFLlIiKQoKZGF0ICU+JQogIHN1bW1hcnlTRSguLCBtZWFzdXJldmFyID0gImV4cGxvaXRhdHQiLCBncm91cHZhcnMgPSAiaW5kdXN0cnkiLCBuYS5ybSA9IFRSVUUpCmBgYAoKYGBge3J9CnNvdXJjZSgic3VtbWFyeVNFLlIiKQoKZGF0ICU+JQogIHN1bW1hcnlTRSguLCBtZWFzdXJldmFyID0gIndiYXR0IiwgZ3JvdXB2YXJzID0gImluZHVzdHJ5IiwgbmEucm0gPSBUUlVFKQpgYGAKCk5vdGU6IFZlcnkgbG93IG4tc2l6ZSBmb3IgY2VydGFpbiBpbmR1c3RyaWVzLiBDb25zaWRlciBkcm9wcGluZyBncm91cHMuCgpTcGVjaWZpY2FsbHksIHRoZSBmb2xsb3dpbmcgY2F0ZWdvcmllcyBoYXZlIE4gPCAyMDoKCmBgYHtyfQpkYXQgJT4lCiAgZ3JvdXBfYnkoaW5kdXN0cnkpICU+JQogIHNlbGVjdChpbmR1c3RyeSkgJT4lCiAgY291bnQoKSAlPiUKICBmaWx0ZXIoZnJlcSA8IDIwKQpgYGAKCiMjIyBBTk9WQSAoT3JnIERlaHVtYW5pemF0aW9uKQpUZXN0IGZvciBob21vZ2VuZWl0eSBvZiB2YXJpYW5jZSBmaXJzdC4gVXNlIHRoZSBub24tcGFyYW1ldHJpYyBGbGlnbmVyLUtpbGxlZW4gVGVzdC4KYGBge3J9CmZsaWduZXIudGVzdChvcmdkZWh1bSB+IGluZHVzdHJ5LCBkYXRhID0gZGF0KQpmbGlnbmVyLnRlc3Qoc2JsbSB+IGluZHVzdHJ5LCBkYXRhID0gZGF0KQpmbGlnbmVyLnRlc3QoZXhwbG9pdGF0dCB+IGluZHVzdHJ5LCBkYXRhID0gZGF0KQpmbGlnbmVyLnRlc3Qod2JhdHQgfiBpbmR1c3RyeSwgZGF0YSA9IGRhdCkKYGBgCgoKYGBge3J9CnN1bW1hcnkoYW92KG9yZ2RlaHVtIH4gaW5kdXN0cnksIGRhdGEgPSBkYXQpKQpgYGAKClNpZ25pZmljYW50IG1lYW4gZGlmZmVyZW5jZSBpbiBvcmdhbml6YXRpb25hbCBkZWh1bWFuaXphdGlvbiBiZXR3ZWVuIGluZHVzdHJpZXMuCgojIyMgVHVrZXkgVGVzdCAoT3JnIERlaHVtYW5pemF0aW9uKQpgYGB7cn0KdHVrZXkub2RoaW5kdXN0cnkgPC0gdGlkeShUdWtleUhTRChhb3Yob3JnZGVodW0gfiBpbmR1c3RyeSwgZGF0YSA9IGRhdCkpKQoKdHVrZXkub2RoaW5kdXN0cnkgJT4lCiAgc2VsZWN0KC10ZXJtKSAlPiUKICBmaWx0ZXIoYWRqLnAudmFsdWUgPCAuMDUpCmBgYAoKTm9uZSBvZiB0aGUgZ3JvdXBzIGNvbXBhcmVkIGFib3ZlIGhhZCBOIDwgMjAuCgojIyMgQ3JlYXRlIGxhYmVscyB3aXRoIGNhcGl0YWxpemVkIGxldHRlcnMgZm9yIGdyYXBoaW5nCmBgYHtyfQpkYXQkaW5kdXN0cnkgPC0gYXMuZmFjdG9yKGRhdCRpbmR1c3RyeSkKYGBgCgoKIyMjIFZpc3VhbGl6YXRpb24gKE9yZyBEZWh1bWFuaXphdGlvbikKYGBge3J9CnNvdXJjZSgic3VtbWFyeVNFLlIiKQoKZGF0ICU+JQogIHNlbGVjdChpbmR1c3RyeSwgb3JnZGVodW0pICU+JQogIGZpbHRlcihpbmR1c3RyeSAlaW4lIGMoImFydHMsIGVudGVydGFpbm1lbnQsIHJlY3JlYXRpb24iLCAiYWNjb21tb2RhdGlvbiwgZm9vZCBzZXJ2aWNlcyIpKSAlPiUKICBncm91cF9ieShpbmR1c3RyeSkgJT4lCiAgc3VtbWFyeVNFKC4sIG1lYXN1cmV2YXIgPSAib3JnZGVodW0iLCBncm91cHZhcnMgPSAiaW5kdXN0cnkiLCBuYS5ybSA9IFRSVUUpCgpkYXQgJT4lCiAgZmlsdGVyKGluZHVzdHJ5ICVpbiUgYygiYXJ0cywgZW50ZXJ0YWlubWVudCwgcmVjcmVhdGlvbiIsICJhY2NvbW1vZGF0aW9uLCBmb29kIHNlcnZpY2VzIikpICU+JQogIHN1bW1hcnlTRSguLCBtZWFzdXJldmFyID0gIm9yZ2RlaHVtIiwgZ3JvdXB2YXJzID0gImluZHVzdHJ5IiwgbmEucm0gPSBUUlVFKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBpbmR1c3RyeSwgeSA9IG9yZ2RlaHVtLCBncm91cCA9IGluZHVzdHJ5LCBmaWxsID0gaW5kdXN0cnkpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMC4zKSArCiAgc2NhbGVfZmlsbF9ncmV5KHN0YXJ0ID0gLjQsIGVuZCA9IC44KSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IG9yZ2RlaHVtIC0gY2ksIHltYXggPSBvcmdkZWh1bSArIGNpKSwgc2l6ZSA9IDAuNSwgd2lkdGggPSAwLjA3KSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBjKCJBY2NvbW1vZGF0aW9uLCBGb29kIFNlcnZpY2VzIiwgIkFydHMsIEVudGVydGFpbm1lbnQsIFJlY3JlYXRpb24iKSkgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIGxpbWl0cyA9IGMoMCw3KSwgYnJlYWtzID0gYygxOjcpKSArCiAgbGFicyh4ID0gIkluZHVzdHJ5IiwgeSA9ICJPcmdhbml6YXRpb25hbCBEZWh1bWFuaXphdGlvbiIpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpICsgZ3VpZGVzKGZpbGwgPSBGQUxTRSkKYGBgCgpgYGB7cn0Kc291cmNlKCJzdW1tYXJ5U0UuUiIpCgpkYXQgJT4lCiAgc2VsZWN0KGluZHVzdHJ5LCBvcmdkZWh1bSkgJT4lCiAgZmlsdGVyKGluZHVzdHJ5ICVpbiUgYygiZmluYW5jZSwgaW5zdXJhbmNlIiwgImFjY29tbW9kYXRpb24sIGZvb2Qgc2VydmljZXMiKSkgJT4lCiAgZ3JvdXBfYnkoaW5kdXN0cnkpICU+JQogIHN1bW1hcnlTRSguLCBtZWFzdXJldmFyID0gIm9yZ2RlaHVtIiwgZ3JvdXB2YXJzID0gImluZHVzdHJ5IiwgbmEucm0gPSBUUlVFKQoKZGF0ICU+JQogIGZpbHRlcihpbmR1c3RyeSAlaW4lIGMoImZpbmFuY2UsIGluc3VyYW5jZSIsICJhY2NvbW1vZGF0aW9uLCBmb29kIHNlcnZpY2VzIikpICU+JQogIHN1bW1hcnlTRSguLCBtZWFzdXJldmFyID0gIm9yZ2RlaHVtIiwgZ3JvdXB2YXJzID0gImluZHVzdHJ5IiwgbmEucm0gPSBUUlVFKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBpbmR1c3RyeSwgeSA9IG9yZ2RlaHVtLCBncm91cCA9IGluZHVzdHJ5LCBmaWxsID0gaW5kdXN0cnkpKSArCiAgc2NhbGVfZmlsbF9ncmV5KHN0YXJ0ID0gLjQsIGVuZCA9IC44KSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMC4zKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IG9yZ2RlaHVtIC0gY2ksIHltYXggPSBvcmdkZWh1bSArIGNpKSwgc2l6ZSA9IDAuNSwgd2lkdGggPSAwLjA3KSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBjKCJBY2NvbW1vZGF0aW9uLCBGb29kIFNlcnZpY2VzIiwgIkZpbmFuY2UsIEluc3VyYW5jZSIpKSArICAKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCBsaW1pdHMgPSBjKDAsNyksIGJyZWFrcyA9IGMoMTo3KSkgKwogIGxhYnMoeCA9ICJJbmR1c3RyeSIsIHkgPSAiT3JnYW5pemF0aW9uYWwgRGVodW1hbml6YXRpb24iKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpKSArIGd1aWRlcyhmaWxsID0gRkFMU0UpCmBgYAoKYGBge3J9CnNvdXJjZSgic3VtbWFyeVNFLlIiKQoKZGF0ICU+JQogIHNlbGVjdChpbmR1c3RyeSwgb3JnZGVodW0pICU+JQogIGZpbHRlcihpbmR1c3RyeSAlaW4lIGMoInJldGFpbCB0cmFkZSIsICJhcnRzLCBlbnRlcnRhaW5tZW50LCByZWNyZWF0aW9uIikpICU+JQogIGdyb3VwX2J5KGluZHVzdHJ5KSAlPiUKICBzdW1tYXJ5U0UoLiwgbWVhc3VyZXZhciA9ICJvcmdkZWh1bSIsIGdyb3VwdmFycyA9ICJpbmR1c3RyeSIsIG5hLnJtID0gVFJVRSkKCmRhdCAlPiUKICBmaWx0ZXIoaW5kdXN0cnkgJWluJSBjKCJyZXRhaWwgdHJhZGUiLCAiYXJ0cywgZW50ZXJ0YWlubWVudCwgcmVjcmVhdGlvbiIpKSAlPiUKICBzdW1tYXJ5U0UoLiwgbWVhc3VyZXZhciA9ICJvcmdkZWh1bSIsIGdyb3VwdmFycyA9ICJpbmR1c3RyeSIsIG5hLnJtID0gVFJVRSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gaW5kdXN0cnksIHkgPSBvcmdkZWh1bSwgZ3JvdXAgPSBpbmR1c3RyeSwgZmlsbCA9IGluZHVzdHJ5KSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IDAuMykgKwogIHNjYWxlX2ZpbGxfZ3JleShzdGFydCA9IC40LCBlbmQgPSAuOCkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBvcmdkZWh1bSAtIGNpLCB5bWF4ID0gb3JnZGVodW0gKyBjaSksIHNpemUgPSAwLjUsIHdpZHRoID0gMC4wNykgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gYygiQXJ0cywgRW50ZXJ0YWlubWVudCwgUmVjcmVhdGlvbiIsICJSZXRhaWwgVHJhZGUiKSkgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIGxpbWl0cyA9IGMoMCw3KSwgYnJlYWtzID0gYygxOjcpKSArCiAgbGFicyh4ID0gIkluZHVzdHJ5IiwgeSA9ICJPcmdhbml6YXRpb25hbCBEZWh1bWFuaXphdGlvbiIpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpICsgZ3VpZGVzKGZpbGwgPSBGQUxTRSkKYGBgCgpgYGB7cn0Kc291cmNlKCJzdW1tYXJ5U0UuUiIpCgpkYXQgJT4lCiAgc2VsZWN0KGluZHVzdHJ5LCBvcmdkZWh1bSkgJT4lCiAgZmlsdGVyKGluZHVzdHJ5ICVpbiUgYygicmV0YWlsIHRyYWRlIiwgImVkdWNhdGlvbmFsIHNlcnZpY2VzIikpICU+JQogIGdyb3VwX2J5KGluZHVzdHJ5KSAlPiUKICBzdW1tYXJ5U0UoLiwgbWVhc3VyZXZhciA9ICJvcmdkZWh1bSIsIGdyb3VwdmFycyA9ICJpbmR1c3RyeSIsIG5hLnJtID0gVFJVRSkKCmRhdCAlPiUKICBmaWx0ZXIoaW5kdXN0cnkgJWluJSBjKCJyZXRhaWwgdHJhZGUiLCAiZWR1Y2F0aW9uYWwgc2VydmljZXMiKSkgJT4lCiAgc3VtbWFyeVNFKC4sIG1lYXN1cmV2YXIgPSAib3JnZGVodW0iLCBncm91cHZhcnMgPSAiaW5kdXN0cnkiLCBuYS5ybSA9IFRSVUUpICU+JQogIGdncGxvdChhZXMoeCA9IGluZHVzdHJ5LCB5ID0gb3JnZGVodW0sIGdyb3VwID0gaW5kdXN0cnksIGZpbGwgPSBpbmR1c3RyeSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgd2lkdGggPSAwLjMpICsKICBzY2FsZV9maWxsX2dyZXkoc3RhcnQgPSAuNCwgZW5kID0gLjgpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gb3JnZGVodW0gLSBjaSwgeW1heCA9IG9yZ2RlaHVtICsgY2kpLCBzaXplID0gMC41LCB3aWR0aCA9IDAuMDcpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGMoIkVkdWNhdGlvbmFsIFNlcnZpY2VzIiwgIlJldGFpbCBUcmFkZSIpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygwLDcpLCBicmVha3MgPSBjKDE6NykpICsKICBsYWJzKHggPSAiSW5kdXN0cnkiLCB5ID0gIk9yZ2FuaXphdGlvbmFsIERlaHVtYW5pemF0aW9uIikgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSkgKyBndWlkZXMoZmlsbCA9IEZBTFNFKQpgYGAKCmBgYHtyfQpzb3VyY2UoInN1bW1hcnlTRS5SIikKCmRhdCAlPiUKICBzZWxlY3QoaW5kdXN0cnksIG9yZ2RlaHVtKSAlPiUKICBmaWx0ZXIoaW5kdXN0cnkgJWluJSBjKCJyZXRhaWwgdHJhZGUiLCAiZmluYW5jZSwgaW5zdXJhbmNlIikpICU+JQogIGdyb3VwX2J5KGluZHVzdHJ5KSAlPiUKICBzdW1tYXJ5U0UoLiwgbWVhc3VyZXZhciA9ICJvcmdkZWh1bSIsIGdyb3VwdmFycyA9ICJpbmR1c3RyeSIsIG5hLnJtID0gVFJVRSkKCmRhdCAlPiUKICBmaWx0ZXIoaW5kdXN0cnkgJWluJSBjKCJyZXRhaWwgdHJhZGUiLCAiZmluYW5jZSwgaW5zdXJhbmNlIikpICU+JQogIHN1bW1hcnlTRSguLCBtZWFzdXJldmFyID0gIm9yZ2RlaHVtIiwgZ3JvdXB2YXJzID0gImluZHVzdHJ5IiwgbmEucm0gPSBUUlVFKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBpbmR1c3RyeSwgeSA9IG9yZ2RlaHVtLCBncm91cCA9IGluZHVzdHJ5LCBmaWxsID0gaW5kdXN0cnkpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMC4zKSArCiAgc2NhbGVfZmlsbF9ncmV5KHN0YXJ0ID0gLjQsIGVuZCA9IC44KSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IG9yZ2RlaHVtIC0gY2ksIHltYXggPSBvcmdkZWh1bSArIGNpKSwgc2l6ZSA9IDAuNSwgd2lkdGggPSAwLjA3KSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBjKCJGaW5hbmNlLCBJbnN1cmFuY2UiLCAiUmV0YWlsIFRyYWRlIikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCBsaW1pdHMgPSBjKDAsNyksIGJyZWFrcyA9IGMoMTo3KSkgKwogIGxhYnMoeCA9ICJJbmR1c3RyeSIsIHkgPSAiT3JnYW5pemF0aW9uYWwgRGVodW1hbml6YXRpb24iKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpKSArIGd1aWRlcyhmaWxsID0gRkFMU0UpCmBgYAoKIyMjIEFOT1ZBIChCTE0pCmBgYHtyfQpzdW1tYXJ5KGFvdihzYmxtIH4gaW5kdXN0cnksIGRhdGEgPSBkYXQpKQpgYGAKClNpZ25pZmljYW50IG1lYW4gZGlmZmVyZW5jZSBpbiBCTE0gYmV0d2VlbiBpbmR1c3RyaWVzLgoKIyMjIFR1a2V5IFRlc3QgKEJMTSkKYGBge3J9CnR1a2V5LnNibG1pbmR1c3RyeSA8LSB0aWR5KFR1a2V5SFNEKGFvdihzYmxtIH4gaW5kdXN0cnksIGRhdGEgPSBkYXQpKSkKCnR1a2V5LnNibG1pbmR1c3RyeSAlPiUKICBzZWxlY3QoLXRlcm0pICU+JQogIGZpbHRlcihhZGoucC52YWx1ZSA8IC4wNSkKYGBgCgojIyMgVmlzdWFsaXphdGlvbiAoQkxNKQpgYGB7cn0Kc291cmNlKCJzdW1tYXJ5U0UuUiIpCgpkYXQgJT4lCiAgc2VsZWN0KGluZHVzdHJ5LCBzYmxtKSAlPiUKICBmaWx0ZXIoaW5kdXN0cnkgJWluJSBjKCJlZHVjYXRpb25hbCBzZXJ2aWNlcyIsICJhY2NvbW1vZGF0aW9uLCBmb29kIHNlcnZpY2VzIikpICU+JQogIGdyb3VwX2J5KGluZHVzdHJ5KSAlPiUKICBzdW1tYXJ5U0UoLiwgbWVhc3VyZXZhciA9ICJzYmxtIiwgZ3JvdXB2YXJzID0gImluZHVzdHJ5IiwgbmEucm0gPSBUUlVFKQoKZGF0ICU+JQogIGZpbHRlcihpbmR1c3RyeSAlaW4lIGMoImVkdWNhdGlvbmFsIHNlcnZpY2VzIiwgImFjY29tbW9kYXRpb24sIGZvb2Qgc2VydmljZXMiKSkgJT4lCiAgc3VtbWFyeVNFKC4sIG1lYXN1cmV2YXIgPSAic2JsbSIsIGdyb3VwdmFycyA9ICJpbmR1c3RyeSIsIG5hLnJtID0gVFJVRSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gaW5kdXN0cnksIHkgPSBzYmxtLCBncm91cCA9IGluZHVzdHJ5LCBmaWxsID0gaW5kdXN0cnkpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMC4zKSArCiAgc2NhbGVfZmlsbF9ncmV5KHN0YXJ0ID0gLjQsIGVuZCA9IC44KSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IHNibG0gLSBjaSwgeW1heCA9IHNibG0gKyBjaSksIHNpemUgPSAwLjUsIHdpZHRoID0gMC4wNykgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gYygiQWNjb21tb2RhdGlvbiwgRm9vZCBTZXJ2aWNlcyIsICJFZHVjYXRpb25hbCBTZXJ2aWNlcyIpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygwLDcpLCBicmVha3MgPSBjKDE6NykpICsKICBsYWJzKHggPSAiSW5kdXN0cnkiLCB5ID0gIlN1cGVydmlzb3IncyBCb3R0b20tTGluZSBNZW50YWxpdHkiKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpKSArIGd1aWRlcyhmaWxsID0gRkFMU0UpCmBgYAoKYGBge3J9CnNvdXJjZSgic3VtbWFyeVNFLlIiKQoKZGF0ICU+JQogIHNlbGVjdChpbmR1c3RyeSwgc2JsbSkgJT4lCiAgZmlsdGVyKGluZHVzdHJ5ICVpbiUgYygiZmluYW5jZSwgaW5zdXJhbmNlIiwgImFjY29tbW9kYXRpb24sIGZvb2Qgc2VydmljZXMiKSkgJT4lCiAgZ3JvdXBfYnkoaW5kdXN0cnkpICU+JQogIHN1bW1hcnlTRSguLCBtZWFzdXJldmFyID0gInNibG0iLCBncm91cHZhcnMgPSAiaW5kdXN0cnkiLCBuYS5ybSA9IFRSVUUpCgpkYXQgJT4lCiAgZmlsdGVyKGluZHVzdHJ5ICVpbiUgYygiZmluYW5jZSwgaW5zdXJhbmNlIiwgImFjY29tbW9kYXRpb24sIGZvb2Qgc2VydmljZXMiKSkgJT4lCiAgc3VtbWFyeVNFKC4sIG1lYXN1cmV2YXIgPSAic2JsbSIsIGdyb3VwdmFycyA9ICJpbmR1c3RyeSIsIG5hLnJtID0gVFJVRSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gaW5kdXN0cnksIHkgPSBzYmxtLCBncm91cCA9IGluZHVzdHJ5LCBmaWxsID0gaW5kdXN0cnkpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMC4zKSArCiAgc2NhbGVfZmlsbF9ncmV5KHN0YXJ0ID0gLjQsIGVuZCA9IC44KSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IHNibG0gLSBjaSwgeW1heCA9IHNibG0gKyBjaSksIHNpemUgPSAwLjUsIHdpZHRoID0gMC4wNykgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gYygiQWNjb21tb2RhdGlvbiwgRm9vZCBTZXJ2aWNlcyIsICJGaW5hbmNlLCBJbnN1cmFuY2UiKSkgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIGxpbWl0cyA9IGMoMCw3KSwgYnJlYWtzID0gYygxOjcpKSArCiAgbGFicyh4ID0gIkluZHVzdHJ5IiwgeSA9ICJTdXBlcnZpc29yJ3MgQm90dG9tLUxpbmUgTWVudGFsaXR5IikgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSkgKyBndWlkZXMoZmlsbCA9IEZBTFNFKQpgYGAKCmBgYHtyfQpzb3VyY2UoInN1bW1hcnlTRS5SIikKCmRhdCAlPiUKICBzZWxlY3QoaW5kdXN0cnksIHNibG0pICU+JQogIGZpbHRlcihpbmR1c3RyeSAlaW4lIGMoInJldGFpbCB0cmFkZSIsICJlZHVjYXRpb25hbCBzZXJ2aWNlcyIpKSAlPiUKICBncm91cF9ieShpbmR1c3RyeSkgJT4lCiAgc3VtbWFyeVNFKC4sIG1lYXN1cmV2YXIgPSAic2JsbSIsIGdyb3VwdmFycyA9ICJpbmR1c3RyeSIsIG5hLnJtID0gVFJVRSkKCmRhdCAlPiUKICBmaWx0ZXIoaW5kdXN0cnkgJWluJSBjKCJyZXRhaWwgdHJhZGUiLCAiZWR1Y2F0aW9uYWwgc2VydmljZXMiKSkgJT4lCiAgc3VtbWFyeVNFKC4sIG1lYXN1cmV2YXIgPSAic2JsbSIsIGdyb3VwdmFycyA9ICJpbmR1c3RyeSIsIG5hLnJtID0gVFJVRSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gaW5kdXN0cnksIHkgPSBzYmxtLCBncm91cCA9IGluZHVzdHJ5LCBmaWxsID0gaW5kdXN0cnkpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMC4zKSArCiAgc2NhbGVfZmlsbF9ncmV5KHN0YXJ0ID0gLjQsIGVuZCA9IC44KSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IHNibG0gLSBjaSwgeW1heCA9IHNibG0gKyBjaSksIHNpemUgPSAwLjUsIHdpZHRoID0gMC4wNykgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gYygiRWR1Y2F0aW9uYWwgU2VydmljZXMiLCAiUmV0YWlsIFRyYWRlIikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCBsaW1pdHMgPSBjKDAsNyksIGJyZWFrcyA9IGMoMTo3KSkgKwogIGxhYnMoeCA9ICJJbmR1c3RyeSIsIHkgPSAiU3VwZXJ2aXNvcidzIEJvdHRvbS1MaW5lIE1lbnRhbGl0eSIpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpICsgZ3VpZGVzKGZpbGwgPSBGQUxTRSkKYGBgCgpgYGB7cn0Kc291cmNlKCJzdW1tYXJ5U0UuUiIpCgpkYXQgJT4lCiAgc2VsZWN0KGluZHVzdHJ5LCBzYmxtKSAlPiUKICBmaWx0ZXIoaW5kdXN0cnkgJWluJSBjKCJyZXRhaWwgdHJhZGUiLCAiZmluYW5jZSwgaW5zdXJhbmNlIikpICU+JQogIGdyb3VwX2J5KGluZHVzdHJ5KSAlPiUKICBzdW1tYXJ5U0UoLiwgbWVhc3VyZXZhciA9ICJzYmxtIiwgZ3JvdXB2YXJzID0gImluZHVzdHJ5IiwgbmEucm0gPSBUUlVFKQoKZGF0ICU+JQogIGZpbHRlcihpbmR1c3RyeSAlaW4lIGMoInJldGFpbCB0cmFkZSIsICJmaW5hbmNlLCBpbnN1cmFuY2UiKSkgJT4lCiAgc3VtbWFyeVNFKC4sIG1lYXN1cmV2YXIgPSAic2JsbSIsIGdyb3VwdmFycyA9ICJpbmR1c3RyeSIsIG5hLnJtID0gVFJVRSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gaW5kdXN0cnksIHkgPSBzYmxtLCBncm91cCA9IGluZHVzdHJ5LCBmaWxsID0gaW5kdXN0cnkpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMC4zKSArCiAgc2NhbGVfZmlsbF9ncmV5KHN0YXJ0ID0gLjQsIGVuZCA9IC44KSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IHNibG0gLSBjaSwgeW1heCA9IHNibG0gKyBjaSksIHNpemUgPSAwLjUsIHdpZHRoID0gMC4wNykgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gYygiRmluYW5jZSwgSW5zdXJhbmNlIiwgIlJldGFpbCBUcmFkZSIpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygwLDcpLCBicmVha3MgPSBjKDE6NykpICsKICBsYWJzKHggPSAiSW5kdXN0cnkiLCB5ID0gIlN1cGVydmlzb3IncyBCb3R0b20tTGluZSBNZW50YWxpdHkiKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpKSArIGd1aWRlcyhmaWxsID0gRkFMU0UpCmBgYAoKIyMjIEFOT1ZBIChIUiBBdHRyaWJ1dGlvbnMpCmBgYHtyfQpzdW1tYXJ5KGFvdihleHBsb2l0YXR0IH4gaW5kdXN0cnksIGRhdGEgPSBkYXQpKQpgYGAKCmBgYHtyfQpzdW1tYXJ5KGFvdih3YmF0dCB+IGluZHVzdHJ5LCBkYXRhID0gZGF0KSkKYGBgCgpObyBzaWduaWZpY2FudCBtZWFuIGRpZmZlcmVuY2VzIGluIGF0dHJpYnV0aW9ucyBhY3Jvc3MgaW5kdXN0cmllcy4gSG93ZXZlciwgcC12YWx1ZXMgbWF5IGJlIGNvbnNpZGVyZWQgIm1hcmdpbmFsIi4KCioqKioKCiMjIE1hcml0YWwgU3RhdHVzCgpgYGB7cn0KZGF0ICU+JQogIGdyb3VwX2J5KG1hcml0YWwpICU+JQogIHRhbGx5KCkKYGBgCgpgYGB7cn0KZGF0ICU+JQogIGdyb3VwX2J5KG1hcml0YWwpICU+JQogIHN1bW1hcml6ZShvcmdkZWh1bSA9IG1lYW4ob3JnZGVodW0sIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIHNibG0gPSBtZWFuKHNibG0sIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIGV4cGxvaXRhdHQgPSBtZWFuKGV4cGxvaXRhdHQsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIHdiYXR0ID0gbWVhbih3YmF0dCwgbmEucm0gPSBUUlVFKSkKYGBgCgpgYGB7cn0Kc3VtbWFyeShhb3Yob3JnZGVodW0gfiBtYXJpdGFsLCBkYXRhID0gZGF0KSkKYGBgCgpgYGB7cn0Kc3VtbWFyeShhb3Yoc2JsbSB+IG1hcml0YWwsIGRhdGEgPSBkYXQpKQpgYGAKCmBgYHtyfQpzdW1tYXJ5KGFvdihleHBsb2l0YXR0IH4gbWFyaXRhbCwgZGF0YSA9IGRhdCkpCmBgYAoKYGBge3J9CnN1bW1hcnkoYW92KHdiYXR0IH4gbWFyaXRhbCwgZGF0YSA9IGRhdCkpCmBgYAoKTm8gc2lnbmlmaWNhbnQgbWVhbiBkaWZmZXJlbmNlcyBpbiB2YXJpYWJsZXMgb2YgaW50ZXJlc3QgYWNyb3NzIG1hcml0YWwgc3RhdHVzLgoKKioqKgoKIyMgUmFjZQoKYGBge3J9CmRhdCAlPiUKICBzZWxlY3QocmFjZSkgJT4lCiAgZ3JvdXBfYnkocmFjZSkgJT4lCiAgdGFsbHkoKQpgYGAKCmBgYHtyfQpkYXQgJT4lCiAgZ3JvdXBfYnkocmFjZSkgJT4lCiAgc3VtbWFyaXplKG9yZ2RlaHVtID0gbWVhbihvcmdkZWh1bSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgc2JsbSA9IG1lYW4oc2JsbSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgZXhwbG9pdGF0dCA9IG1lYW4oZXhwbG9pdGF0dCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgd2JhdHQgPSBtZWFuKHdiYXR0LCBuYS5ybSA9IFRSVUUpKQpgYGAKCmBgYHtyfQpzdW1tYXJ5KGFvdihvcmdkZWh1bSB+IHJhY2UsIGRhdGEgPSBkYXQpKQpgYGAKCmBgYHtyfQpzdW1tYXJ5KGFvdihzYmxtIH4gcmFjZSwgZGF0YSA9IGRhdCkpCmBgYAoKYGBge3J9CnN1bW1hcnkoYW92KGV4cGxvaXRhdHQgfiByYWNlLCBkYXRhID0gZGF0KSkKYGBgCgpgYGB7cn0Kc3VtbWFyeShhb3Yod2JhdHQgfiByYWNlLCBkYXRhID0gZGF0KSkKYGBgCgpObyBzaWduaWZpY2FudCBtZWFuIGRpZmZlcmVuY2VzIGluIHZhcmlhYmxlcyBvZiBpbnRlcmVzdCBhY3Jvc3MgcmFjZXMuIE5vdGFibHksIGhvd2V2ZXIsIEJsYWNrIGVtcGxveWVlcyBhcHBlYXIgdG8gZGlmZmVyIHNsaWdodGx5LgoKKioqKgoKIyMgT3JnIFR5cGUKCk9yZ2FuaXphdGlvbiB0eXBlIChmb3ItcHJvZml0IHZzIG5vbnByb2ZpdCkgd2FzIGNvcnJlbGF0ZWQgd2l0aCBzZXZlcmFsIHZhcmlhYmxlcyBvZiBpbnRlcmVzdC4KCiMjIyBWYXJpYWJsZSBQcmVwYXJhdGlvbgpgYGB7cn0KZGF0ICU8PiUKICBtdXRhdGUob3JndHlwZSA9IHJlY29kZV9mYWN0b3Iob3JndHlwZSwgYDFgID0gIkZvci1wcm9maXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGAwYCA9ICJOb25wcm9maXQiKSkKYGBgCgoKIyMjIE9yZ2FuaXphdGlvbiBUeXBlIGFuZCBEZWh1bWFuaXphdGlvbgpgYGB7cn0Kc291cmNlKCJzdW1tYXJ5U0UuUiIpCgpkYXQgJT4lCiAgc3VtbWFyeVNFKC4sIG1lYXN1cmV2YXIgPSAib3JnZGVodW0iLCBncm91cHZhcnMgPSAib3JndHlwZSIsIG5hLnJtID0gVFJVRSkKYGBgCgpgYGB7cn0KdC50ZXN0KGRhdCRvcmdkZWh1bSB+IGRhdCRvcmd0eXBlKQpgYGAKCmBgYHtyfQp0LnRlc3QoZGF0JG9yZ2RlaHVtIH4gZGF0JG9yZ3R5cGUsIHZhci5lcXVhbCA9IFRSVUUpCmBgYAoKU2lnbmlmaWNhbnQgbWVhbiBkaWZmZXJlbmNlIGJldHdlZW4gZ3JvdXBzLiBUZXN0cyBhc3N1bWluZyBlcXVhbCBhbmQgdW5lcXVhbCB2YXJpYW5jZXMgeWllbGQgc2ltaWxhciByZXN1bHRzLgoKYGBge3J9CnNvdXJjZSgic3VtbWFyeVNFLlIiKQoKZGF0ICU+JQogIHN1bW1hcnlTRSguLCBtZWFzdXJldmFyID0gIm9yZ2RlaHVtIiwgZ3JvdXB2YXJzID0gIm9yZ3R5cGUiLCBuYS5ybSA9IFRSVUUpICU+JQogIGdncGxvdChhZXMoeCA9IG9yZ3R5cGUsIHkgPSBvcmdkZWh1bSwgZ3JvdXAgPSBvcmd0eXBlLCBmaWxsID0gb3JndHlwZSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgd2lkdGggPSAwLjMpICsKICBzY2FsZV9maWxsX2dyZXkoc3RhcnQgPSAuNCwgZW5kID0gLjgpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gb3JnZGVodW0gLSBjaSwgeW1heCA9IG9yZ2RlaHVtICsgY2kpLCBzaXplID0gMC41LCB3aWR0aCA9IDAuMDcpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCBsaW1pdHMgPSBjKDAsNyksIGJyZWFrcyA9IGMoMTo3KSkgKwogIGxhYnMoeCA9ICJPcmdhbml6YXRpb24gVHlwZSIsIHkgPSAiT3JnYW5pemF0aW9uYWwgRGVodW1hbml6YXRpb24iKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpKSArIGd1aWRlcyhmaWxsID0gRkFMU0UpCmBgYApOb3RlOiBFcnJvciBiYXJzIHJlZmxlY3QgY29uZmlkZW5jZSBpbnRlcnZhbHMuCgojIyMgT3JnYW5pemF0aW9uIFR5cGUgYW5kIEV4cGxvaXRhdGlvbiBBdHRyaWJ1dGlvbnMKYGBge3J9CnNvdXJjZSgic3VtbWFyeVNFLlIiKQoKZGF0ICU+JQogIHN1bW1hcnlTRSguLCBtZWFzdXJldmFyID0gImV4cGxvaXRhdHQiLCBncm91cHZhcnMgPSAib3JndHlwZSIsIG5hLnJtID0gVFJVRSkKYGBgCgoKYGBge3J9CnQudGVzdChkYXQkZXhwbG9pdGF0dCB+IGRhdCRvcmd0eXBlKQpgYGAKCmBgYHtyfQp0LnRlc3QoZGF0JGV4cGxvaXRhdHQgfiBkYXQkb3JndHlwZSwgdmFyLmVxdWFsID0gVFJVRSkKYGBgCgpgYGB7cn0Kc291cmNlKCJzdW1tYXJ5U0UuUiIpCgpkYXQgJT4lCiAgc3VtbWFyeVNFKC4sIG1lYXN1cmV2YXIgPSAiZXhwbG9pdGF0dCIsIGdyb3VwdmFycyA9ICJvcmd0eXBlIiwgbmEucm0gPSBUUlVFKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBvcmd0eXBlLCB5ID0gZXhwbG9pdGF0dCwgZ3JvdXAgPSBvcmd0eXBlLCBmaWxsID0gb3JndHlwZSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgd2lkdGggPSAwLjMpICsKICBzY2FsZV9maWxsX2dyZXkoc3RhcnQgPSAuNCwgZW5kID0gLjgpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gZXhwbG9pdGF0dCAtIGNpLCB5bWF4ID0gZXhwbG9pdGF0dCArIGNpKSwgc2l6ZSA9IDAuNSwgd2lkdGggPSAwLjA3KSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygwLDcpLCBicmVha3MgPSBjKDE6NykpICsKICBsYWJzKHggPSAiT3JnYW5pemF0aW9uIFR5cGUiLCB5ID0gIk9yZ2FuaXphdGlvbi1DZW50cmljIEhSIEF0dHJpYnV0aW9ucyIpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpICsgZ3VpZGVzKGZpbGwgPSBGQUxTRSkKYGBgCk5vdGU6IEVycm9yIGJhcnMgcmVmbGVjdCBjb25maWRlbmNlIGludGVydmFscy4KCiMjIyBPcmdhbml6YXRpb24gVHlwZSBhbmQgQkxNCmBgYHtyfQpzb3VyY2UoInN1bW1hcnlTRS5SIikKCmRhdCAlPiUKICBzdW1tYXJ5U0UoLiwgbWVhc3VyZXZhciA9ICJzYmxtIiwgZ3JvdXB2YXJzID0gIm9yZ3R5cGUiLCBuYS5ybSA9IFRSVUUpCmBgYAoKCmBgYHtyfQp0LnRlc3QoZGF0JHNibG0gfiBkYXQkb3JndHlwZSkKYGBgCgpgYGB7cn0KdC50ZXN0KGRhdCRzYmxtIH4gZGF0JG9yZ3R5cGUsIHZhci5lcXVhbCA9IFRSVUUpCmBgYAoKYGBge3J9CnNvdXJjZSgic3VtbWFyeVNFLlIiKQoKZGF0ICU+JQogIHN1bW1hcnlTRSguLCBtZWFzdXJldmFyID0gInNibG0iLCBncm91cHZhcnMgPSAib3JndHlwZSIsIG5hLnJtID0gVFJVRSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gb3JndHlwZSwgeSA9IHNibG0sIGdyb3VwID0gb3JndHlwZSwgZmlsbCA9IG9yZ3R5cGUpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMC4zKSArCiAgc2NhbGVfZmlsbF9ncmV5KHN0YXJ0ID0gLjQsIGVuZCA9IC44KSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IHNibG0gLSBjaSwgeW1heCA9IHNibG0gKyBjaSksIHNpemUgPSAwLjUsIHdpZHRoID0gMC4wNykgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIGxpbWl0cyA9IGMoMCw3KSwgYnJlYWtzID0gYygxOjcpKSArCiAgbGFicyh4ID0gIk9yZ2FuaXphdGlvbiBUeXBlIiwgeSA9ICJTdXBlcnZpc29yJ3MgQm90dG9tLWxpbmUgTWVudGFsaXR5IikgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSkgKyBndWlkZXMoZmlsbCA9IEZBTFNFKQpgYGAKTm90ZTogRXJyb3IgYmFycyByZWZsZWN0IGNvbmZpZGVuY2UgaW50ZXJ2YWxzLgoKKioqKgoKIyMgT3JnIExldmVscwoKIyMjIE9yZyBMZXZlbHMgYW5kIFZhcmlhYmxlcyBvZiBJbnRlcmVzdAoKYGBge3J9CmNvci50ZXN0KGRhdCRvcmdsZXZlbHMsIGRhdCRleHBsb2l0YXR0LCBtZXRob2QgPSAic3BlYXJtYW4iKQpgYGAKCk91dHB1dCBmb3IgU3BlYXJtYW4ncyByaG8geWllbGRzIGEgd2FybmluZyB0aGF0IGRhdGEgc2FtcGxlcyBjb250YWlucyBjb3JyZWxhdGVkIHRpZXMuIEtlbmRhbGwncyB0YXUtYiBjb2VmZmljaWVudCBjYW4gaGFuZGxlIHRpZXMgKGJlbG93KS4KCmBgYHtyfQpjb3IudGVzdChkYXQkb3JnbGV2ZWxzLCBkYXQkZXhwbG9pdGF0dCwgbWV0aG9kID0gImtlbmRhbGwiKQpgYGAKCgpgYGB7cn0KY29yLnRlc3QoZGF0JG9yZ2xldmVscywgZGF0JG9yZ2RlaHVtLCBtZXRob2QgPSAic3BlYXJtYW4iKQoKY29yLnRlc3QoZGF0JG9yZ2xldmVscywgZGF0JG9yZ2RlaHVtLCAgbWV0aG9kID0gImtlbmRhbGwiKQpgYGAKClNpZ25pZmljYW50IHBvc2l0aXZlIGNvcnJlbGF0aW9uIGJldHdlZW4gb3JnIGxldmVscyBhbmQgb3JnIGRlaHVtYW5pemF0aW9uLgoKYGBge3J9CmNvci50ZXN0KGRhdCRvcmdsZXZlbHMsIGRhdCRzYmxtLCBtZXRob2QgPSAia2VuZGFsbCIpCmBgYAoKYGBge3J9CmNvci50ZXN0KGRhdCRvcmdsZXZlbHMsIGRhdCR3YmF0dCwgbWV0aG9kID0gImtlbmRhbGwiKQpgYGAKCk5vIHNpZ25pZmljYW50IHJhbmsgY29ycmVsYXRpb24gYmV0d2VlbiBvcmcgbGV2ZWxzIGFuZCBCTE0gb3Igd2VsbC1iZWluZyBhdHRyaWJ1dGlvbnMuCgojIyMgVmFyaWFibGUgUHJlcGFyYXRpb24gZm9yIFZpc3VhbGl6YXRpb24KCmBgYHtyfQpkYXQgJTw+JQogIG11dGF0ZShvcmdsZXZlbHMgPSByZWNvZGVfZmFjdG9yKG9yZ2xldmVscywgYDFgID0gInRocmVlIG9yIGZld2VyIGxldmVscyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDJgID0gImZvdXIgbGV2ZWxzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgM2AgPSAiZml2ZSBsZXZlbHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA0YCA9ICJzaXggbGV2ZWxzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNWAgPSAic2V2ZW4gbGV2ZWxzIG9yIG1vcmUiLCAub3JkZXJlZCA9IFRSVUUpKQpgYGAKCiMjIyBPcmcgTGV2ZWxzIGFuZCBFeHBsb2l0YXRpb24gQXR0cmlidXRpb25zCmBgYHtyfQpzb3VyY2UoInN1bW1hcnlTRS5SIikKCmRhdCAlPiUKICBzdW1tYXJ5U0UoLiwgbWVhc3VyZXZhciA9ICJleHBsb2l0YXR0IiwgZ3JvdXB2YXJzID0gIm9yZ2xldmVscyIpCmBgYAoKYGBge3J9CnNvdXJjZSgic3VtbWFyeVNFLlIiKQoKZGF0ICU+JQogIHN1bW1hcnlTRSguLCBtZWFzdXJldmFyID0gImV4cGxvaXRhdHQiLCBncm91cHZhcnMgPSAib3JnbGV2ZWxzIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gb3JnbGV2ZWxzLCB5ID0gZXhwbG9pdGF0dCwgZ3JvdXAgPSAxKSkgKyAKICAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBleHBsb2l0YXR0IC0gY2ksIHltYXggPSBleHBsb2l0YXR0ICsgY2kpLCB3aWR0aD0uMSkgKwogICAgZ2VvbV9saW5lKCkgKyBnZW9tX3BvaW50KCkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygxLDUpKSArCiAgICBsYWJzKHggPSAiTGV2ZWxzIGluIE9yZ2FuaXphdGlvbiIsIHkgPSAiRXhwbG9pdGF0aW9uIEF0dHJpYnV0aW9ucyIpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArIGd1aWRlcyhmaWxsID0gRkFMU0UpCmBgYAoKTm90ZTogRXJyb3IgYmFycyByZWZsZWN0IGNvbmZpZGVuY2UgaW50ZXJ2YWxzLgoKQ29uZmlkZW5jZSBpbnRlcnZhbHMgYXBwZWFyIHRvIG92ZXJsYXAgc3Vic3RhbnRpYWxseS4KCiMjIyBPcmcgTGV2ZWxzIGFuZCBPcmdhbml6YXRpb25hbCBEZWh1bWFuaXphdGlvbgpgYGB7cn0Kc291cmNlKCJzdW1tYXJ5U0UuUiIpCgpkYXQgJT4lCiAgc3VtbWFyeVNFKC4sIG1lYXN1cmV2YXIgPSAib3JnZGVodW0iLCBncm91cHZhcnMgPSAib3JnbGV2ZWxzIiwgbmEucm0gPSBUUlVFKQpgYGAKCmBgYHtyfQpkYXQgJT4lCiAgc3VtbWFyeVNFKC4sIG1lYXN1cmV2YXIgPSAib3JnZGVodW0iLCBncm91cHZhcnMgPSAib3JnbGV2ZWxzIiwgbmEucm0gPSBUUlVFKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBvcmdsZXZlbHMsIHkgPSBvcmdkZWh1bSwgZ3JvdXAgPSAxKSkgKyAKICAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBvcmdkZWh1bSAtIGNpLCB5bWF4ID0gb3JnZGVodW0gKyBjaSksIHdpZHRoPS4xKSArCiAgICBnZW9tX2xpbmUoKSArIGdlb21fcG9pbnQoKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCBsaW1pdHMgPSBjKDEsNSkpICsKICAgIGxhYnMoeCA9ICJMZXZlbHMgaW4gT3JnYW5pemF0aW9uIiwgeSA9ICJFeHBsb2l0YXRpb24gQXR0cmlidXRpb25zIikgKwogICAgdGhlbWVfY2xhc3NpYygpICsgZ3VpZGVzKGZpbGwgPSBGQUxTRSkKYGBgCgpOb3RlOiBFcnJvciBiYXJzIHJlZmxlY3QgY29uZmlkZW5jZSBpbnRlcnZhbHMuCgpDb25maWRlbmNlIGludGVydmFscyBhcHBlYXIgdG8gb3ZlcmxhcCBzdWJzdGFudGlhbGx5LgoKKioqKgoKIyMgU2FsYXJ5Ck5vdGU6IEFkZCBhcmd1bWVudCBzdWJzZXQgPSAoZGF0JHNhbGFyeSAhPSAxKSB0byByZW1vdmUgbG93IE4gZ3JvdXAuCmBgYHtyfQpjb3IudGVzdChkYXQkc2FsYXJ5LCBkYXQkZXhwbG9pdGF0dCwgbWV0aG9kID0gInNwZWFybWFuIikKY29yLnRlc3QoZGF0JHNhbGFyeSwgZGF0JGV4cGxvaXRhdHQsIG1ldGhvZCA9ICJrZW5kYWxsIikKYGBgCgpTaWduaWZpY2FudCBuZWdhdGl2ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHNhbGFyeSBhbmQgZXhwbG9pdGF0aW9uIGF0dHJpYnV0aW9ucy4KCmBgYHtyfQpjb3IudGVzdChkYXQkc2FsYXJ5LCBkYXQkc2JsbSwgbWV0aG9kID0gInNwZWFybWFuIikKY29yLnRlc3QoZGF0JHNhbGFyeSwgZGF0JHNibG0sIG1ldGhvZCA9ICJrZW5kYWxsIikKYGBgCgpTaWduaWZpY2FudCBuZWdhdGl2ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHNhbGFyeSBhbmQgQkxNLgoKYGBge3J9CmNvci50ZXN0KGRhdCRzYWxhcnksIGRhdCRvcmdkZWh1bSwgbWV0aG9kID0gInNwZWFybWFuIikKY29yLnRlc3QoZGF0JHNhbGFyeSwgZGF0JG9yZ2RlaHVtLCBtZXRob2QgPSAia2VuZGFsbCIpCmBgYAoKU2lnbmlmaWNhbnQgbmVnYXRpdmUgY29ycmVsYXRpb24gYmV0d2VlbiBzYWxhcnkgYW5kIG9yZ2FuaXphdGlvbmFsIGRlaHVtYW5pemF0aW9uLgoKYGBge3J9CmNvci50ZXN0KGRhdCRzYWxhcnksIGRhdCR3YmF0dCwgbWV0aG9kID0gInNwZWFybWFuIikKY29yLnRlc3QoZGF0JHNhbGFyeSwgZGF0JHdiYXR0LCBtZXRob2QgPSAia2VuZGFsbCIpCmBgYAoKU2lnbmlmaWNhbnQgcG9zaXRpdmUgY29ycmVsYXRpb24gYmV0d2VlbiBzYWxhcnkgYW5kIHdlbGwtYmVpbmcgYXR0cmlidXRpb25zLgoKIyMjIFZhcmlhYmxlIFByZXBhcmF0aW9uIGZvciBWaXN1YWxpemF0aW9uCmBgYHtyfQpkYXQgJTw+JQogIG11dGF0ZShzYWxhcnkgPSByZWNvZGVfZmFjdG9yKHNhbGFyeSwgYDFgID0gImxlc3MgdGhhbiAkMTAsMDAwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMmAgPSAiJDEwLDAwMCB0byAkMTksOTk5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgM2AgPSAiJDIwLDAwMCB0byAkMjksOTk5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNGAgPSAiJDMwLDAwMCB0byAkMzksOTk5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNWAgPSAiJDQwLDAwMCB0byAkNDksOTk5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNmAgPSAiJDUwLDAwMCB0byAkNTksOTk5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgN2AgPSAiJDYwLDAwMCB0byAkNjksOTk5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgOGAgPSAiJDcwLDAwMCBvciBtb3JlIiwgLm9yZGVyZWQgPSBUUlVFKSkKYGBgCgojIyMgU2FsYXJ5IGFuZCBFeHBsb2l0YXRpb24gQXR0cmlidXRpb25zCmBgYHtyfQpzb3VyY2UoInN1bW1hcnlTRS5SIikKCmRhdCAlPiUKICBzdW1tYXJ5U0UoLiwgbWVhc3VyZXZhciA9ICJleHBsb2l0YXR0IiwgZ3JvdXB2YXJzID0gInNhbGFyeSIsIG5hLnJtID0gVFJVRSkKYGBgCgpQZXJoYXBzIG9taXQgaW5kaXZpZHVhbHMgd2l0aCBzYWxhcnkgPCAkMTAsMDAwIGR1ZSB0byBsb3cgTi1zaXplPwoKYGBge3J9CnNvdXJjZSgic3VtbWFyeVNFLlIiKQoKZGF0ICU+JQogIHN1bW1hcnlTRSguLCBtZWFzdXJldmFyID0gImV4cGxvaXRhdHQiLCBncm91cHZhcnMgPSAic2FsYXJ5IiwgbmEucm0gPSBUUlVFKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBzYWxhcnksIHkgPSBleHBsb2l0YXR0LCBncm91cCA9IDEpKSArIAogICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGV4cGxvaXRhdHQgLSBjaSwgeW1heCA9IGV4cGxvaXRhdHQgKyBjaSksIHdpZHRoPS4xKSArCiAgICBnZW9tX2xpbmUoKSArIGdlb21fcG9pbnQoKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCBsaW1pdHMgPSBjKDAsNykpICsKICAgIGxhYnMoeCA9ICJTYWxhcnkiLCB5ID0gIkV4cGxvaXRhdGlvbiBBdHRyaWJ1dGlvbnMiKSArCiAgICB0aGVtZV9jbGFzc2ljKCkgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKQpgYGAKTm90ZTogRXJyb3IgYmFycyByZWZsZWN0IGNvbmZpZGVuY2UgaW50ZXJ2YWxzLgpDSXMgZm9yIGxvd2VzdCBzYWxhcnkgZ3JvdXAgZG9lcyBub3QgZml0IHdpdGhpbiB5LXNjYWxlLgoKIyMjIFNhbGFyeSBhbmQgU3VwZXJ2aXNvcidzIEJvdHRvbS1saW5lIE1lbnRhbGl0eQpgYGB7cn0Kc291cmNlKCJzdW1tYXJ5U0UuUiIpCgpkYXQgJT4lCiAgc3VtbWFyeVNFKC4sIG1lYXN1cmV2YXIgPSAic2JsbSIsIGdyb3VwdmFycyA9ICJzYWxhcnkiLCBuYS5ybSA9IFRSVUUpCmBgYAoKYGBge3J9CnNvdXJjZSgic3VtbWFyeVNFLlIiKQoKZGF0ICU+JQogIHN1bW1hcnlTRSguLCBtZWFzdXJldmFyID0gInNibG0iLCBncm91cHZhcnMgPSAic2FsYXJ5IiwgbmEucm0gPSBUUlVFKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBzYWxhcnksIHkgPSBzYmxtLCBncm91cCA9IDEpKSArIAogICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IHNibG0gLSBjaSwgeW1heCA9IHNibG0gKyBjaSksIHdpZHRoPS4xKSArCiAgICBnZW9tX2xpbmUoKSArIGdlb21fcG9pbnQoKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCBsaW1pdHMgPSBjKDAsNykpICsKICAgIGxhYnMoeCA9ICJTYWxhcnkiLCB5ID0gIlN1cGVydmlzb3IncyBCb3R0b20tbGluZSBNZW50YWxpdHkiKSArCiAgICB0aGVtZV9jbGFzc2ljKCkgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKQpgYGAKCgojIyMgU2FsYXJ5IGFuZCBPcmdhbml6YXRpb25hbCBEZWh1bWFuaXphdGlvbgpgYGB7cn0Kc291cmNlKCJzdW1tYXJ5U0UuUiIpCgpkYXQgJT4lCiAgc3VtbWFyeVNFKC4sIG1lYXN1cmV2YXIgPSAib3JnZGVodW0iLCBncm91cHZhcnMgPSAic2FsYXJ5IiwgbmEucm0gPSBUUlVFKQpgYGAKCmBgYHtyfQpzb3VyY2UoInN1bW1hcnlTRS5SIikKCmRhdCAlPiUKICBzdW1tYXJ5U0UoLiwgbWVhc3VyZXZhciA9ICJvcmdkZWh1bSIsIGdyb3VwdmFycyA9ICJzYWxhcnkiLCBuYS5ybSA9IFRSVUUpICU+JQogIGdncGxvdChhZXMoeCA9IHNhbGFyeSwgeSA9IG9yZ2RlaHVtLCBncm91cCA9IDEpKSArIAogICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IG9yZ2RlaHVtIC0gY2ksIHltYXggPSBvcmdkZWh1bSArIGNpKSwgd2lkdGg9LjEpICsKICAgIGdlb21fbGluZSgpICsgZ2VvbV9wb2ludCgpICsKICAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIGxpbWl0cyA9IGMoMCw3KSkgKwogICAgbGFicyh4ID0gIlNhbGFyeSIsIHkgPSAiT3JnYW5pemF0aW9uYWwgRGVodW1hbml6YXRpb24iKSArCiAgICB0aGVtZV9jbGFzc2ljKCkgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKQpgYGAKCiMjIyBTYWxhcnkgYW5kIFdlbGwtYmVpbmcgQXR0cmlidXRpb25zCmBgYHtyfQpzb3VyY2UoInN1bW1hcnlTRS5SIikKCmRhdCAlPiUKICBzdW1tYXJ5U0UoLiwgbWVhc3VyZXZhciA9ICJ3YmF0dCIsIGdyb3VwdmFycyA9ICJzYWxhcnkiLCBuYS5ybSA9IFRSVUUpCmBgYAoKYGBge3J9CnNvdXJjZSgic3VtbWFyeVNFLlIiKQoKZGF0ICU+JQogIHN1bW1hcnlTRSguLCBtZWFzdXJldmFyID0gIndiYXR0IiwgZ3JvdXB2YXJzID0gInNhbGFyeSIsIG5hLnJtID0gVFJVRSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gc2FsYXJ5LCB5ID0gd2JhdHQsIGdyb3VwID0gMSkpICsgCiAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gd2JhdHQgLSBjaSwgeW1heCA9IHdiYXR0ICsgY2kpLCB3aWR0aD0uMSkgKwogICAgZ2VvbV9saW5lKCkgKyBnZW9tX3BvaW50KCkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygwLDcpKSArCiAgICBsYWJzKHggPSAiU2FsYXJ5IiwgeSA9ICJXZWxsLWJlaW5nIEF0dHJpYnV0aW9ucyIpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpCmBgYAoKKioqKgoKIyMgRWR1Y2F0aW9uCgpgYGB7cn0KY29yLnRlc3QoZGF0JGVkdSwgZGF0JHNibG0sIG1ldGhvZCA9ICJzcGVhcm1hbiIpCmNvci50ZXN0KGRhdCRlZHUsIGRhdCRzYmxtLCBtZXRob2QgPSAia2VuZGFsbCIpCmBgYAoKU2lnbmlmaWNhbnQgbmVnYXRpdmUgY29ycmVsYXRpb24gYmV0d2VlbiBlZHVjYXRpb24gYW5kIEJMTS4KCmBgYHtyfQpjb3IudGVzdChkYXQkZWR1LCBkYXQkb3JnZGVodW0sIG1ldGhvZCA9ICJzcGVhcm1hbiIpCmNvci50ZXN0KGRhdCRlZHUsIGRhdCRvcmdkZWh1bSwgbWV0aG9kID0gImtlbmRhbGwiKQpgYGAKClNpZ25pZmljYW50IG5lZ2F0aXZlIGNvcnJlbGF0aW9uIGJldHdlZW4gZWR1Y2F0aW9uIGFuZCBvcmcgZGVodW1hbml6YXRpb24uCgojIyMgVmFyaWFibGUgUHJlcGFyYXRpb24gZm9yIFZpc3VhbGl6YXRpb24KCmBgYHtyfQpkYXQgJTw+JQogIG11dGF0ZShlZHUgPSByZWNvZGVfZmFjdG9yKGVkdSwgYDFgID0gImhpZ2ggc2Nob29sLCBHRUQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAyYCA9ICJhc3NvY2lhdGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgM2AgPSAiY29sbGVnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDRgID0gIm1hc3RlcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA1YCA9ICJkb2N0b3JhbCIsIC5vcmRlcmVkID0gVFJVRSkpCmBgYAoKIyMjIEVkdWNhdGlvbiBhbmQgQkxNCmBgYHtyfQpzb3VyY2UoInN1bW1hcnlTRS5SIikKCmRhdCAlPiUKICBzdW1tYXJ5U0UoLiwgbWVhc3VyZXZhciA9ICJzYmxtIiwgZ3JvdXB2YXJzID0gImVkdSIsIG5hLnJtID0gVFJVRSkKYGBgCgpgYGB7cn0Kc291cmNlKCJzdW1tYXJ5U0UuUiIpCgpkYXQgJT4lCiAgc3VtbWFyeVNFKC4sIG1lYXN1cmV2YXIgPSAic2JsbSIsIGdyb3VwdmFycyA9ICJlZHUiLCBuYS5ybSA9IFRSVUUpICU+JQogIGdncGxvdChhZXMoeCA9IGVkdSwgeSA9IHNibG0sIGdyb3VwID0gMSkpICsgCiAgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gc2JsbSAtIGNpLCB5bWF4ID0gc2JsbSArIGNpKSwgd2lkdGg9LjEpICsKICAgIGdlb21fbGluZSgpICsgZ2VvbV9wb2ludCgpICsKICAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIGxpbWl0cyA9IGMoMCw3KSkgKwogICAgbGFicyh4ID0gIkVkdWNhdGlvbiIsIHkgPSAiU3VwZXJ2aXNvcidzIEJvdHRvbS1saW5lIE1lbnRhbGl0eSIpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpCmBgYAoKCiMjIyBFZHVjYXRpb24gYW5kIE9yZyBEZWh1bWFuaXphdGlvbgpgYGB7cn0Kc291cmNlKCJzdW1tYXJ5U0UuUiIpCgpkYXQgJT4lCiAgc3VtbWFyeVNFKC4sIG1lYXN1cmV2YXIgPSAib3JnZGVodW0iLCBncm91cHZhcnMgPSAiZWR1IiwgbmEucm0gPSBUUlVFKQpgYGAKCmBgYHtyfQpzb3VyY2UoInN1bW1hcnlTRS5SIikKCmRhdCAlPiUKICBzdW1tYXJ5U0UoLiwgbWVhc3VyZXZhciA9ICJvcmdkZWh1bSIsIGdyb3VwdmFycyA9ICJlZHUiLCBuYS5ybSA9IFRSVUUpICU+JQogIGdncGxvdChhZXMoeCA9IGVkdSwgeSA9IG9yZ2RlaHVtLCBncm91cCA9IDEpKSArIAogICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IG9yZ2RlaHVtIC0gY2ksIHltYXggPSBvcmdkZWh1bSArIGNpKSwgd2lkdGg9LjEpICsKICAgIGdlb21fbGluZSgpICsgZ2VvbV9wb2ludCgpICsKICAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIGxpbWl0cyA9IGMoMCw3KSkgKwogICAgbGFicyh4ID0gIkVkdWNhdGlvbiIsIHkgPSAiT3JnYW5pemF0aW9uYWwgRGVodW1hbml6YXRpb24iKSArCiAgICB0aGVtZV9jbGFzc2ljKCkgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKQpgYGAKCk5vdGFibHksIGVkdWNhdGlvbiBpcyBwb3NpdGl2ZWx5IHJlbGF0ZWQgdG8gc2FsYXJ5IGFuZCByZXNwb25zaWJpbGl0eSBmb3IgZGlyZWN0IHJlcG9ydHMuCgoqKioqCiMjIFJlc3BvbnNpYmxlIGZvciBEaXJlY3QgUmVwb3J0cwoKUmVzcG9uc2liaWxpdHkgZm9yIGRpcmVjdCByZXBvcnRzIGNvcnJlbGF0ZWQgd2l0aCB3ZWxsLWJlaW5nIGF0dHJpYnV0aW9ucyBhbmQgb3JnIGRlaHVtYW5pemF0aW9uLgoKIyMjIFZhcmlhYmxlIFByZXBhcmF0aW9uCmBgYHtyfQpkYXQgJTw+JQogIG11dGF0ZShkaXJyZXBvcnQgPSByZWNvZGVfZmFjdG9yKGRpcnJlcG9ydCwgYDFgID0gIlllcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDBgID0gIk5vIikpCmBgYAoKIyMjIFJlc3BvbnNpYmlsaXR5IGFuZCBXZWxsLWJlaW5nIEF0dHJpYnV0aW9ucwpgYGB7cn0Kc291cmNlKCJzdW1tYXJ5U0UuUiIpCgpkYXQlPiUKICBzdW1tYXJ5U0UoLiwgbWVhc3VyZXZhciA9ICJ3YmF0dCIsIGdyb3VwdmFycyA9ICJkaXJyZXBvcnQiLCBuYS5ybSA9IFRSVUUpCmBgYAoKYGBge3J9CnQudGVzdChkYXQkd2JhdHQgfiBkYXQkZGlycmVwb3J0LCB2YXIuZXF1YWwgPSBUUlVFKQpgYGAKCmBgYHtyfQpzb3VyY2UoInN1bW1hcnlTRS5SIikKCmRhdCAlPiUKICBzdW1tYXJ5U0UoLiwgbWVhc3VyZXZhciA9ICJ3YmF0dCIsIGdyb3VwdmFycyA9ICJkaXJyZXBvcnQiLCBuYS5ybSA9IFRSVUUpICU+JQogIGdncGxvdChhZXMoeCA9IGRpcnJlcG9ydCwgeSA9IHdiYXR0LCBncm91cCA9IGRpcnJlcG9ydCwgZmlsbCA9IGRpcnJlcG9ydCkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgd2lkdGggPSAwLjMpICsKICBzY2FsZV9maWxsX2dyZXkoc3RhcnQgPSAuNCwgZW5kID0gLjgpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gd2JhdHQgLSBjaSwgeW1heCA9IHdiYXR0ICsgY2kpLCBzaXplID0gMC41LCB3aWR0aCA9IDAuMDcpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCBsaW1pdHMgPSBjKDAsNyksIGJyZWFrcyA9IGMoMTo3KSkgKwogIGxhYnMoeCA9ICJSZXNwb25zaWJpbGl0eSBmb3IgRGlyZWN0IFJlcG9ydHMiLCB5ID0gIkVtcGxveWVlLUNlbnRyaWMgSFIgQXR0cmlidXRpb25zIikgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSkgKyBndWlkZXMoZmlsbCA9IEZBTFNFKQpgYGAKTm90ZTogRXJyb3IgYmFycyByZXByZXNlbnQgY29uZmlkZW5jZSBpbnRlcnZhbHMuCgpBbHRob3VnaCB0LXRlc3QgaXMgc2lnbmlmaWNhbnQsIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIG92ZXJsYXAuCgojIyMgUmVzcG9uc2liaWxpdHkgYW5kIE9yZyBEZWh1bWFuaXphdGlvbgpgYGB7cn0Kc291cmNlKCJzdW1tYXJ5U0UuUiIpCgpkYXQgJT4lCiAgc3VtbWFyeVNFKC4sIG1lYXN1cmV2YXIgPSAib3JnZGVodW0iLCBncm91cHZhcnMgPSAiZGlycmVwb3J0IiwgbmEucm0gPSBUUlVFKQpgYGAKCmBgYHtyfQp0LnRlc3QoZGF0JG9yZ2RlaHVtIH4gZGF0JGRpcnJlcG9ydCwgdmFyLmVxdWFsID0gVFJVRSkKYGBgCgpgYGB7cn0Kc291cmNlKCJzdW1tYXJ5U0UuUiIpCgpkYXQgJT4lCiAgc3VtbWFyeVNFKC4sIG1lYXN1cmV2YXIgPSAib3JnZGVodW0iLCBncm91cHZhcnMgPSAiZGlycmVwb3J0IiwgbmEucm0gPSBUUlVFKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBkaXJyZXBvcnQsIHkgPSBvcmdkZWh1bSwgZ3JvdXAgPSBkaXJyZXBvcnQsIGZpbGwgPSBkaXJyZXBvcnQpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMC4zKSArCiAgc2NhbGVfZmlsbF9ncmV5KHN0YXJ0ID0gLjQsIGVuZCA9IC44KSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IG9yZ2RlaHVtIC0gY2ksIHltYXggPSBvcmdkZWh1bSArIGNpKSwgc2l6ZSA9IDAuNSwgd2lkdGggPSAwLjA3KSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwKSwgbGltaXRzID0gYygwLDcpLCBicmVha3MgPSBjKDE6NykpICsKICBsYWJzKHggPSAiUmVzcG9uc2liaWxpdHkgZm9yIERpcmVjdCBSZXBvcnRzIiwgeSA9ICJPcmdhbml6YXRpb25hbCBEZWh1bWFuaXphdGlvbiIpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpICsgZ3VpZGVzKGZpbGwgPSBGQUxTRSkKYGBgCk5vdGU6IEVycm9yIGJhcnMgcmVwcmVzZW50IGNvbmZpZGVuY2UgaW50ZXJ2YWxzLgoKQWx0aG91Z2ggdC10ZXN0IGlzIHNpZ25pZmljYW50LCBjb25maWRlbmNlIGludGVydmFscyBvdmVybGFwLgoKKioqKgoK